diff --git a/dashboard/templates/overview.html b/dashboard/templates/overview.html index 49eafc32e..738941376 100644 --- a/dashboard/templates/overview.html +++ b/dashboard/templates/overview.html @@ -2,6 +2,7 @@ {% set show_company_breakdown = (not company) and (not user_id) %} {% set show_engineer_breakdown = ((company) or (module)) and (not user_id) %} +{% set show_bp_breakdown = (module) and (not user_id) and (metric == 'bpd!') %} {% set show_module_breakdown = (not module) %} {% set show_user_activity = (user_id) %} {% set show_module_activity = (module) and (not user_id) %} @@ -22,6 +23,9 @@ {% if show_engineer_breakdown %} renderTableAndChart("/api/1.0/stats/engineers", "engineer_container", "engineer_table", "engineer_chart", "user_id", {company: "{{ company|encode }}" }); {% endif %} + {% if show_bp_breakdown %} + renderTableAndChart("/api/1.0/stats/bpd", "bp_container", "bp_table", "bp_chart", "bpd", {module: "{{ module|encode }}" }); + {% endif %} {% if show_module_breakdown %} renderTableAndChart("/api/1.0/stats/modules", "module_container", "module_table", "module_chart", "module"); {% endif %} @@ -108,7 +112,7 @@
+${lines_added} - ${lines_deleted}
{%elif record_type == "mark" %} -
Patch submitted by {%html parent_author_link %}
+
Patch #${review_attempt} submitted by {%html parent_author_link %}
${subject}
Change Id: ${review_id}
${description}: ${value}
@@ -210,7 +214,7 @@ # Engineer {{ metric_label }} - {% if metric == 'marks' %} + {% if metric in ['marks', 'nc_marks'] %} -2|-1|+1|+2 (+/- ratio) {% endif %} @@ -222,6 +226,27 @@ {% endif %} + {% if show_bp_breakdown %} +
+

Mention # by blueprint

+ +
+ + + + + + + + + + + +
#BlueprintMention #
+
+
+ {% endif %} + {% if show_user_profile %}
{% endif %} diff --git a/dashboard/web.py b/dashboard/web.py index 763167546..de619292f 100644 --- a/dashboard/web.py +++ b/dashboard/web.py @@ -47,6 +47,7 @@ METRIC_LABELS = { 'loc': 'Lines of code', 'commits': 'Commits', 'marks': 'Reviews', + 'nc_marks': 'Newcomers Reviews', 'emails': 'Emails', 'bpd': 'Drafted Blueprints', 'bpc': 'Completed Blueprints', @@ -56,6 +57,7 @@ METRIC_TO_RECORD_TYPE = { 'loc': 'commit', 'commits': 'commit', 'marks': 'mark', + 'nc_marks': 'mark', 'emails': 'email', 'bpd': 'bpd', 'bpc': 'bpc', @@ -347,6 +349,16 @@ def record_filter(ignore=None, use_default=True): record_ids &= memory_storage.get_record_ids_by_type( METRIC_TO_RECORD_TYPE[metric]) + if metric == 'nc_marks': + filtered_ids = [] + for record in memory_storage.get_records(record_ids): + parent = memory_storage.get_record_by_primary_key( + record['review_id']) + if (parent and ('review_attempt' in parent) + and (parent['review_attempt'] <= 5)): + filtered_ids.append(record['record_id']) + record_ids = filtered_ids + kwargs['records'] = memory_storage.get_records(record_ids) return f(*args, **kwargs) @@ -404,6 +416,7 @@ def aggregate_filter(): 'commits': (incremental_filter, None), 'loc': (loc_filter, None), 'marks': (mark_filter, mark_finalize), + 'nc_marks': (mark_filter, mark_finalize), 'emails': (incremental_filter, None), 'bpd': (incremental_filter, None), 'bpc': (incremental_filter, None), @@ -646,6 +659,7 @@ def get_activity_json(records): parent = memory_storage_inst.get_record_by_primary_key( review['review_id']) if parent: + review['review_attempt'] = parent.get('review_attempt') review['subject'] = parent['subject'] review['url'] = parent['url'] review['parent_author_link'] = make_link( @@ -782,6 +796,39 @@ def get_module(module): flask.abort(404) +@app.route('/api/1.0/stats/bpd/') +@jsonify('stats') +@exception_handler() +def get_bpd(module): + memory_storage_inst = get_vault()['memory_storage'] + + module = module.lower() + record_ids = ( + set(memory_storage_inst.get_record_ids_by_type('bpd')) & + set(memory_storage_inst.get_record_ids_by_modules([module]))) + + # param = get_parameter(kwargs, 'release', 'releases', use_default) + # if param: + # if 'all' not in param: + # record_ids &= ( + # memory_storage.get_record_ids_by_releases( + # c.lower() for c in param)) + + result = [] + for record in memory_storage_inst.get_records(record_ids): + result.append({ + 'date': record['date'], + 'lifecycle_status': record['lifecycle_status'], + 'metric': record['mention_count'], + 'id': record['name'], + 'name': record['name'], + }) + + result.sort(key=lambda x: x['metric']) + + return result + + @app.route('/api/1.0/users') @jsonify('users') @exception_handler() diff --git a/stackalytics/processor/record_processor.py b/stackalytics/processor/record_processor.py index 7e9dded68..f493b5f69 100644 --- a/stackalytics/processor/record_processor.py +++ b/stackalytics/processor/record_processor.py @@ -372,6 +372,7 @@ class RecordProcessor(object): self.runtime_storage_inst.set_by_key('users', self.users_index) def _get_records_for_users_to_update(self): + users_reviews = {} valid_blueprints = {} mentioned_blueprints = {} for record in self.runtime_storage_inst.get_all_records(): @@ -392,6 +393,14 @@ class RecordProcessor(object): 'date': record['date'] } + if record['record_type'] == 'review': + launchpad_id = record['launchpad_id'] + review = {'date': record['date'], 'id': record['id']} + if launchpad_id in users_reviews: + users_reviews[launchpad_id].append(review) + else: + users_reviews[launchpad_id] = [review] + for bp in valid_blueprints.keys(): if bp in mentioned_blueprints: valid_blueprints[bp]['count'] = ( @@ -399,6 +408,15 @@ class RecordProcessor(object): valid_blueprints[bp]['date'] = ( mentioned_blueprints[bp]['date']) + reviews_index = {} + for launchpad_id, reviews in users_reviews.iteritems(): + reviews.sort(key=lambda x: x['date']) + review_attempt = 0 + for review in reviews: + review_attempt += 1 + review['review_attempt'] = review_attempt + reviews_index[review['id']] = review + for record in self.runtime_storage_inst.get_all_records(): need_update = False @@ -433,6 +451,12 @@ class RecordProcessor(object): record['primary_key'], bp['count'], bp['date']) need_update = True + if record['record_type'] == 'review': + review = reviews_index[record['id']] + if record.get('review_attempt') != review['review_attempt']: + record['review_attempt'] = review['review_attempt'] + need_update = True + if need_update: yield record