diff --git a/etc/default_data.json b/etc/default_data.json index aa4738146..f25535ba2 100644 --- a/etc/default_data.json +++ b/etc/default_data.json @@ -1,5 +1,535 @@ { "users": [ + { + "companies": [ + { + "company_name": "Sorint.lab", + "end_date": null + } + ], + "user_name": "Simone Gotti", + "emails": ["simone.gotti@gmail.com"] + }, + { + "companies": [ + { + "company_name": "CoreOS", + "end_date": null + } + ], + "user_name": "Evan Cordell", + "emails": ["cordell.evan@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Intuit", + "end_date": null + } + ], + "user_name": "Grant Hoffman", + "emails": ["grantleehoffman@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Docker", + "end_date": null + } + ], + "user_name": "Nassim 'Nass' Eddequiouaq", + "emails": ["eddequiouaq.nassim@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Microsoft", + "end_date": null + } + ], + "user_name": "Avi Vaid", + "emails": ["avaid1996@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Wandera", + "end_date": null + } + ], + "user_name": "Santiagor Torres", + "emails": ["torresariass@gmail.com"] + }, + { + "companies": [ + { + "company_name": "NYU Tandon School of Engineering", + "end_date": null + } + ], + "user_name": "Vladimir Diaz", + "emails": ["vladimir.v.diaz@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Buoyant", + "end_date": null + } + ], + "user_name": "Dennis Adjei-Baah", + "emails": ["dennis@buoyant.io", "dadjeibaah@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Buoyant", + "end_date": null + } + ], + "user_name": "William Morgan", + "emails": ["william@buoyant.io", "wmorgan@users.noreply.github.com"] + }, + { + "companies": [ + { + "company_name": "National Center for Biotechnology Information (NCBI)", + "end_date": null + } + ], + "user_name": "Borys Pierov", + "emails": ["pierovbg@ncbi.nlm.nih.gov", "github@ashald.net"] + }, + { + "companies": [ + { + "company_name": "Buoyant", + "end_date": null + } + ], + "user_name": "Andrew Seigner", + "emails": ["siggy@buoyant.io", "andrew@sig.gy"] + }, + { + "companies": [ + { + "company_name": "Buoyant", + "end_date": null + } + ], + "user_name": "Eliza Weismanf", + "emails": ["eliza@buoyant.io", "eliza@elizas.website"] + }, + { + "companies": [ + { + "company_name": "TriggerMesh", + "end_date": null + } + ], + "user_name": "Sebastien Goasguen", + "emails": ["runseb@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Microsoft", + "end_date": null + } + ], + "user_name": "Taylor Thomas", + "emails": ["thomastaylor312@gmail.com"] + }, + { + "companies": [ + { + "company_name": "ARM", + "end_date": null + } + ], + "user_name": "Eduardo Silva", + "emails": ["eduardo@monkey.io"] + }, + { + "companies": [ + { + "company_name": "Treasure Data", + "end_date": null + } + ], + "user_name": "Masahiro Nakagawa", + "emails": ["repeatedly@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Treasure Data", + "end_date": null + } + ], + "user_name": "TAGOMORI Satoshi", + "emails": ["tagomoris@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Pixel Federation", + "end_date": null + } + ], + "user_name": "Martin Fris", + "emails": ["rasta@lj.sk"] + }, + { + "companies": [ + { + "company_name": "Google", + "end_date": null + } + ], + "user_name": "Alain Jobart", + "emails": ["alainjobart@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Lockheed Martin", + "end_date": null + } + ], + "user_name": "Derek Perkins", + "emails": ["derek@derekperkins.com"] + }, + { + "companies": [ + { + "company_name": "Google", + "end_date": null + } + ], + "user_name": "Shenzhe Yao", + "emails": ["yaoshengzhe@gmail.com"] + }, + { + "companies": [ + { + "company_name": "PlanetScale", + "end_date": null + } + ], + "user_name": "Sugu Sougoumarane", + "emails": ["ssougou@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Weaveworks", + "end_date": null + } + ], + "user_name": "Bryan Boreham", + "emails": ["bjboreham@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Pivotal", + "end_date": null + } + ], + "user_name": "Jonathan Boulle", + "emails": ["jonathanboulle@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Pivotal", + "end_date": null + } + ], + "user_name": "Gabe Rosenhouse", + "emails": ["rosenhouse@gmail.com"] + }, + { + "companies": [ + { + "company_name": "CoreOS", + "end_date": null + } + ], + "user_name": "Stefan Junker", + "emails": ["mail@stefanjunker.de"] + }, + { + "companies": [ + { + "company_name": "Uber", + "end_date": null + } + ], + "user_name": "David Yeghshatyan", + "emails": ["6davidy@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Uber", + "end_date": null + } + ], + "user_name": "Won Jun Jang", + "emails": ["wjang@uber.com", "wonjun.jangobe@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Google", + "end_date": null + } + ], + "user_name": "Muxi Yan", + "emails": ["muxi@users.noreply.github.com"] + }, + { + "companies": [ + { + "company_name": "Google", + "end_date": null + } + ], + "user_name": "Masood Tattermusch", + "emails": ["jtattermusch@users.noreply.github.com"] + }, + { + "companies": [ + { + "company_name": "Google", + "end_date": null + } + ], + "user_name": "Masood Malekghassemi", + "emails": ["soltanmm@users.noreply.github.com"] + }, + { + "companies": [ + { + "company_name": "Grafana Labs", + "end_date": null + } + ], + "user_name": "Tom Wilkie", + "emails": ["tom.wilkie@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Google", + "end_date": null + } + ], + "user_name": "Fabian Reinartz", + "emails": ["fab.reinartz@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Grafana Labs", + "end_date": null + } + ], + "user_name": "Goutham Veeramachaneni", + "emails": ["cs14btech11014@iith.ac.in"] + }, + { + "companies": [ + { + "company_name": "Walmart", + "end_date": null + } + ], + "user_name": "Pat Moroney", + "emails": ["pat@pat.email"] + }, + { + "companies": [ + { + "company_name": "Google", + "end_date": null + } + ], + "user_name": "Nikhil Jindal", + "emails": ["nikhiljindal18@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Paul Morie", + "emails": ["pmorie@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Facebook", + "end_date": null + } + ], + "user_name": "Di Xu", + "emails": ["stephenhsu90@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Google", + "end_date": null + } + ], + "user_name": "Auni Ahsan", + "emails": ["auni@google.com", "auni.ahsan53@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Google", + "end_date": null + } + ], + "user_name": "James Synge", + "emails": ["jamessynge@google.com", "jamessynge@users.noreply.github.com"] + }, + { + "companies": [ + { + "company_name": "Lyft", + "end_date": null + } + ], + "user_name": "Derek Schaller", + "emails": ["dschaller@users.noreply.github.com", "dschaller@lyft.com"] + }, + { + "companies": [ + { + "company_name": "VMware", + "end_date": null + } + ], + "user_name": "Venil Noronha", + "emails": ["venil.noronha@gmail.com", "veniln@vmware.com"] + }, + { + "companies": [ + { + "company_name": "Uber", + "end_date": null + } + ], + "user_name": "Prithvi Raj", + "emails": ["vprithvi@users.noreply.github.com", "p.r@uber.com"] + }, + { + "companies": [ + { + "company_name": "VMware", + "end_date": null + } + ], + "user_name": "Shriram Rajagopalan", + "emails": ["rshriram@users.noreply.github.com", "shriramr@vmware.com"] + }, + { + "companies": [ + { + "company_name": "Google", + "end_date": null + } + ], + "user_name": "Adam Worrall", + "emails": ["abw@abw-k8s.mtv.corp.google.com", "abw@google.com"] + }, + { + "companies": [ + { + "company_name": "VMware", + "end_date": null + } + ], + "user_name": "Abrar Shivani", + "emails": ["abrars@vmware.com", "shivania@vmware.com"] + }, + { + "companies": [ + { + "company_name": "Microsoft", + "end_date": null + } + ], + "user_name": "Aaron Schlesinger", + "emails": ["aschlesinger@deis.com", "aaron@deis.com", "aaschles@microsoft.com"] + }, + { + "companies": [ + { + "company_name": "Slack", + "end_date": null + } + ], + "user_name": "Stephan Zuercher", + "emails": ["zuercher@gmail.com", "szuercher@slack-corp.com", "stephan@turbinelabs.io"] + }, + { + "companies": [ + { + "company_name": "Google", + "end_date": null + } + ], + "user_name": "Lantao Liu", + "emails": ["taotaotheripper@gmail.com", "lantaol@google.com"] + }, + { + "companies": [ + { + "company_name": "Google", + "end_date": null + } + ], + "user_name": "Craig Tiller", + "emails": ["craig.tiller@gmail.com", "ctiller@google.com"] + }, + { + "companies": [ + { + "company_name": "Google", + "end_date": null + } + ], + "user_name": "Kyu Chang", + "emails": ["kyuhyun217@gmail.com", "kyuc@google.com"] + }, + { + "companies": [ + { + "company_name": "Square, Inc", + "end_date": null + } + ], + "user_name": "Snow Pettersen", + "emails": ["snowp@squareup.com", "aickck@gmail.com"] + }, + { + "companies": [ + { + "company_name": "Salesforce", + "end_date": null + } + ], + "user_name": "Rama Chavali", + "emails": ["rama.rao@salesforce.com", "ramaraochavali@gmail.com"] + }, { "launchpad_id": "0-doug", "companies": [ @@ -293,7 +823,7 @@ "company_name": "Red Hat", "end_date": null } - ], + ], "user_name": "Filip Brychta", "emails": ["fbrychta@redhat.com"] }, @@ -8347,6 +8877,17 @@ "user_name": "Frank Kloeker", "emails": ["f.kloeker@telekom.de", "eumel@arcor.de"] }, + { + "launchpad_id": "fabian-ruff", + "companies": [ + { + "company_name": "SAP", + "end_date": null + } + ], + "user_name": "Fabian Ruff", + "emails": ["fabian@progra.de"] + }, { "launchpad_id": "fabien-boucher", "companies": [ @@ -8507,6 +9048,17 @@ "user_name": "Fausto Marzi", "emails": ["fausto.marzi@ericsson.com", "fausto.marzi@gmail.com", "fausto.marzi@hp.com", "fausto.marzi@hpe.com"] }, + { + "launchpad_id": "feiskyer", + "companies": [ + { + "company_name": "Microsoft", + "end_date": null + } + ], + "user_name": "Pengfei Ni", + "emails": ["peni@microsoft.com", "feiskyer@users.noreply.github.com"] + }, { "launchpad_id": "fellypefca", "companies": [ @@ -9289,6 +9841,17 @@ "user_name": "Guillaume Giamarchi", "emails": ["guillaume.giamarchi@gmail.com"] }, + { + "github_id": "ggreenway", + "companies": [ + { + "company_name": "Apple, Inc.", + "end_date": null + } + ], + "user_name": "Greg Greenway", + "emails": ["ggreenway@users.noreply.github.com", "ggreenway@apple.com"] + }, { "launchpad_id": "gh965852614", "companies": [ @@ -10772,6 +11335,17 @@ "user_name": "Péter Hegedűs", "emails": ["hpeter@inf.u-szeged.hu"] }, + { + "launchpad_id": "hrasiq", + "companies": [ + { + "company_name": "Hitachi", + "end_date": null + } + ], + "user_name": "Heitor Ricardo Alves de Siqueira", + "emails": ["heitorricardo.alvesdesiqueira@fit-tecnologia.org.br"] + }, { "launchpad_id": "htpeng", "companies": [ @@ -10783,6 +11357,17 @@ "user_name": "htpeng", "emails": ["htpeng@fiberhome.com", "phtao1982@gmail.com"] }, + { + "github_id": "htuch", + "companies": [ + { + "company_name": "Google", + "end_date": null + } + ], + "user_name": "Harvey Tuch", + "emails": ["htuch@users.noreply.github.com", "htuch@google.com"] + }, { "launchpad_id": "huachaomao", "github_id": "Huachao", @@ -11568,6 +12153,17 @@ "user_name": "Naveed Massjouni", "emails": ["naveedm9@gmail.com", "naveed.massjouni@rackspace.com"] }, + { + "launchpad_id": "isaachier", + "companies": [ + { + "company_name": "Uber", + "end_date": null + } + ], + "user_name": "Isaac Hier", + "emails": ["ihier@uber.com"] + }, { "launchpad_id": "isantosp", "companies": [ @@ -13994,6 +14590,17 @@ "user_name": "Wang Junqing", "emails": ["wangjunqing@cmss.chinamobile.com", "junqingwang@139.com"] }, + { + "github_id": "junr03", + "companies": [ + { + "company_name": "Lyft", + "end_date": null + } + ], + "user_name": "Jose Ulises Nino Rivera", + "emails": ["jnino@lyft.com", "junr03@users.noreply.github.com"] + }, { "launchpad_id": "justin-a-scott", "companies": [ @@ -14140,6 +14747,17 @@ "user_name": "Kevin McDonald", "emails": ["k3vinmcdonald@gmail.com"] }, + { + "launchpad_id": "k82cn", + "companies": [ + { + "company_name": "Huawei Technologies", + "end_date": null + } + ], + "user_name": "Klaus Ma", + "emails": ["klaus1982.cn@gmail.com"] + }, { "launchpad_id": "kaifeng", "companies": [ @@ -15352,6 +15970,17 @@ "user_name": "Leandro Ignacio Costantino", "emails": ["leandro.i.costantino@intel.com", "lcostantino@gmail.com"] }, + { + "launchpad_id": "ledor473", + "companies": [ + { + "company_name": "Ticket Master", + "end_date": null + } + ], + "user_name": "Louis-Etienne Dorval", + "emails": ["louis-etienne.dorval@ticketmaster.com"] + }, { "launchpad_id": "leeshow", "companies": [ @@ -17577,6 +18206,17 @@ "user_name": "Matthew Taylor", "emails": ["matthew.taylor@digitalpacific.com.au", "matt@mty.net.au"] }, + { + "github_id": "mattklein123", + "companies": [ + { + "company_name": "Lyft", + "end_date": null + } + ], + "user_name": "Matt Klein", + "emails": ["mattklein123@users.noreply.github.com", "mattklein123@outlook.com", "mattklein123@gmail.com"] + }, { "github_id": "mattmahoneyrh", "companies": [ @@ -17621,6 +18261,17 @@ "user_name": "Matt Thompson", "emails": ["mattt@defunct.ca"] }, + { + "launchpad_id": "matttproud", + "companies": [ + { + "company_name": "SoundCloud", + "end_date": null + } + ], + "user_name": "Matt T. Proud", + "emails": ["matt@soundcloud.com"] + }, { "launchpad_id": "maty-grosz", "companies": [ @@ -18293,6 +18944,17 @@ "user_name": "Mike Tamayo", "emails": ["mike.j.tamayo@intel.com", "mikecincotamayo@gmail.com"] }, + { + "launchpad_id": "mikedanese", + "companies": [ + { + "company_name": "Google", + "end_date": null + } + ], + "user_name": "Mike Danese", + "emails": ["mikedanese@google.com"] + }, { "launchpad_id": "mikemason010", "companies": [ @@ -20289,7 +20951,7 @@ } ], "user_name": "Pavol Loffay", - "emails": ["ploffay@redhat.com"] + "emails": ["ploffay@redhat.com", "p.loffay@gmail.com"] }, { "launchpad_id": "pawel-palucki", @@ -21489,6 +22151,17 @@ "user_name": "Renat Akhmerov", "emails": ["renat.akhmerov@gmail.com"] }, + { + "github_id": "ralekseenkov", + "companies": [ + { + "company_name": "Aptomi", + "end_date": null + } + ], + "user_name": "Roman Alekseenkov", + "emails": ["roman@aptomi.io", "ralekseenkov@gmail.com", "ralekseenkov@users.noreply.github.com"] + }, { "launchpad_id": "ramamani-yeleswarapu", "companies": [ @@ -22274,6 +22947,17 @@ "user_name": "Ryan Lucio", "emails": ["rlucio@vmem.com"] }, + { + "github_id": "rmars", + "companies": [ + { + "company_name": "Buoyant", + "end_date": null + } + ], + "user_name": "Risha Mars", + "emails": ["mars@buoyant.com", "mars@buoyant.io", "rmars@users.noreply.github.com"] + }, { "launchpad_id": "rmevans88", "companies": [ @@ -30464,6 +31148,17 @@ "user_name": "Yuntong Jin", "emails": ["yuntongjin@gmail.com", "yuntong.jin@intel.com"] }, + { + "github_id": "yurishkuro", + "companies": [ + { + "company_name": "Uber", + "end_date": null + } + ], + "user_name": "Yuri Shkuro", + "emails": ["ys@uber.com", "yurishkuro@users.noreply.github.com"] + }, { "launchpad_id": "yury-kulaz", "companies": [ @@ -31761,15 +32456,15 @@ "emails": ["zuohuasun@gmail.com", "zhsun@fiberhome.com"] }, { - "github_id": "zxDiscovery", - "companies": [ - { - "company_name": "IBM", - "end_date": null - } - ], - "user_name": "Xu Zhao", - "emails": ["zxDiscovery@gmail.com", "zxxa@cn.ibm.com"] + "github_id": "zxDiscovery", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Xu Zhao", + "emails": ["zxDiscovery@gmail.com", "zxxa@cn.ibm.com"] }, { "launchpad_id": "zxbob", @@ -32001,6 +32696,10 @@ "domains": ["aptira.com"], "company_name": "Aptira" }, + { + "domains": ["aptomi.io"], + "company_name": "Aptomi" + }, { "domains": ["aricent.com"], "company_name": "Aricent" @@ -32106,6 +32805,10 @@ "domains": ["bitergia.com"], "company_name": "Bitergia" }, + { + "domains": ["bitnami.com"], + "company_name": "Bitnami" + }, { "domains": ["bjtu.edu.cn"], "company_name": "Beijing JiaoTong University", @@ -32137,10 +32840,18 @@ "domains": ["boeing.com"], "company_name": "Boeing" }, + { + "domains": ["booking.com"], + "company_name": "Booking.com" + }, { "domains": ["box.com"], "company_name": "Box" }, + { + "domains": ["boxever.com"], + "company_name": "Boxever" + }, { "domains": ["brightcomputing.com"], "company_name": "Bright Computing", @@ -32169,6 +32880,10 @@ "company_name": "Bull", "aliases": ["Bull SAS"] }, + { + "domains": ["buoyant.io"], + "company_name": "Buoyant" + }, { "domains": ["bytedance.com"], "company_name": "Bytedance", @@ -32269,6 +32984,10 @@ "domains": ["citynetwork.se", "citynetwork.eu", "citycloud.com"], "company_name": "City Network" }, + { + "domains": ["clear-code.com"], + "company_name": "Clear Code" + }, { "domains": ["cloud.com"], "company_name": "Citrix Systems" @@ -32350,6 +33069,10 @@ "company_name": "Colt", "aliases": ["Colt Technology Services", "KVH", "KVH Co., Ltd."] }, + { + "domains": ["cookpad.com"], + "company_name": "Cookpad" + }, { "domains": ["coraid.com"], "company_name": "Coraid" @@ -32367,6 +33090,10 @@ "company_name": "Corvisa", "aliases": ["Corvisa Services"] }, + { + "domains": ["covalent.io"], + "company_name": "Covalent" + }, { "domains": ["cray.com"], "company_name": "Cray" @@ -32418,6 +33145,10 @@ "domains": ["datacentred.co.uk", "datacentred.io"], "company_name": "DataCentred" }, + { + "domains": ["datadoghq.com"], + "company_name": "Datadog" + }, { "domains": ["dblinkconsult.com.br"], "company_name": "DBLink Consult" @@ -32470,6 +33201,10 @@ "company_name": "DreamHost", "aliases": ["DreamHost, Inktank"] }, + { + "domains": ["dropbox.com"], + "company_name": "Dropbox" + }, { "domains": ["dtdream.com"], "company_name": "Dt Dream" @@ -32503,6 +33238,10 @@ "domains": ["embrane.com"], "company_name": "Embrane" }, + { + "domains": ["endocode.com"], + "company_name": "Endocode AG" + }, { "domains": ["endurancewindpower.com"], "company_name": "Endurance Wind Power" @@ -32511,6 +33250,10 @@ "domains": ["enea.com"], "company_name": "Enea" }, + { + "domains": ["engineyard.com"], + "company_name": "Engine Yard" + }, { "domains": ["entpnt.com"], "company_name": "Entry Point Networks" @@ -32549,6 +33292,10 @@ "company_name": "FIT Instituto de Tecnologia", "aliases": ["FIT"] }, + { + "domains": ["flipkart.com"], + "company_name": "Flipkart" + }, { "domains": ["florath.net"], "company_name": "flonatel", @@ -32615,6 +33362,10 @@ "domains": ["gplhost.com"], "company_name": "GPLHost" }, + { + "domains": ["grafana.com"], + "company_name": "Grafana Labs" + }, { "domains": ["gresearch.co.uk"], "company_name": "G-Research" @@ -32830,6 +33581,14 @@ "domains": ["intralinks.com"], "company_name": "Intralinks" }, + { + "domains": ["intralinks.com"], + "company_name": "Intralinks" + }, + { + "domains": ["intuit.com"], + "company_name": "Intuit" + }, { "domains": ["inwinstack.com"], "company_name": "inwinSTACK" @@ -33005,10 +33764,18 @@ "domains": ["locaweb.com.br"], "company_name": "Locaweb" }, + { + "domains": ["lockheed.com"], + "company_name": "Lockheed Martin" + }, { "domains": ["lsd.ufcg.edu.br"], "company_name": "Universidade Federal de Campina Grande" }, + { + "domains": ["lyft.com"], + "company_name": "Lyft" + }, { "domains": ["m3s.it"], "company_name": "M3S" @@ -33056,7 +33823,7 @@ "company_name": "Metsi Technologies" }, { - "domains": ["microsoft.com"], + "domains": ["microsoft.com", "deis.com"], "company_name": "Microsoft" }, { @@ -33077,6 +33844,11 @@ "company_name": "MomentumSI", "aliases": ["MomentumSI, Transcend Computing"] }, + { + "domains": ["motorolasolutions.com"], + "company_name": "Motorola", + "aliases": ["Motorola Solutions"] + }, { "domains": ["mvista.com"], "company_name": "MontaVista Software", @@ -33099,6 +33871,10 @@ "domains": ["navy.mil"], "company_name": "US Navy" }, + { + "domains": ["ncbi.nlm.nih.gov"], + "company_name": "National Center for Biotechnology Information (NCBI)" + }, { "domains": ["nebula.com", "ansolabs.com"], "company_name": "Nebula", @@ -33196,11 +33972,24 @@ "domains": ["nust.edu.pk"], "company_name": "NUST" }, + { + "domains": ["nvidia.com"], + "company_name": "Nvidia" + }, { "domains": ["nxp.com"], "company_name": "NXP", "aliases": ["NXP (I) Pvt Ltd", "NXP"] }, + { + "domains": ["nyu.edu", "engineering.nyu.edu"], + "company_name": "NYU", + "aliases": ["NYU Tandon School of Engineering"] + }, + { + "domains": ["oath.com"], + "company_name": "Oath" + }, { "domains": ["objectif-libre.com"], "company_name": "Objectif Libre" @@ -33209,6 +33998,10 @@ "domains": ["ocf.co.uk"], "company_name": "OCF plc" }, + { + "domains": ["offerupnow.com", "offerup.com"], + "company_name": "OfferUp" + }, { "domains": ["oneconvergence.com"], "company_name": "One Convergence", @@ -33275,6 +34068,10 @@ "company_name": "Persistent Systems", "aliases": ["Persistent System Limited", "persistent sys limited", "Persistent Ltd"] }, + { + "domains": ["pinterest.com"], + "company_name": "Pinterest" + }, { "domains": ["pistoncloud.com"], "company_name": "Piston Cloud", @@ -33284,6 +34081,14 @@ "domains": ["pivotal.io", "gopivotal.com", "pivotallabs.com"], "company_name": "Pivotal" }, + { + "domains": ["pixelfederation.com"], + "company_name": "Pixel Federation" + }, + { + "domains": ["planetscale.com"], + "company_name": "PlanetScale" + }, { "domains": ["platform9.com", "platform9.net"], "company_name": "Platform9", @@ -33405,6 +34210,10 @@ "domains": ["rizu.mu"], "company_name": "Rizumu" }, + { + "domains": ["robustperception.io"], + "company_name": "Robust Perception" + }, { "domains": ["salesforce.com"], "company_name": "Salesforce", @@ -33492,6 +34301,10 @@ "company_name": "SK telecom", "aliases": ["SKT", "SKTelecom"] }, + { + "domains": ["slack-corp.com"], + "company_name": "Slack" + }, { "domains": ["snabb.co"], "company_name": "Snabb" @@ -33517,10 +34330,22 @@ "domains": ["sonymobile.com"], "company_name": "Sony Mobile Communications" }, + { + "domains": ["sorint.it", "sorintlab.com"], + "company_name": "Sorint.lab" + }, + { + "domains": ["soundcloud.com"], + "company_name": "SoundCloud" + }, { "domains": ["spilgames.com"], "company_name": "Spil Games" }, + { + "domains": ["squareup.com"], + "company_name": "Square, Inc" + }, { "domains": ["stackhpc.com"], "company_name": "StackHPC" @@ -33553,6 +34378,10 @@ "domains": ["stratoscale.com"], "company_name": "Stratoscale" }, + { + "domains": ["stripe.com"], + "company_name": "Stripe" + }, { "domains": ["stsci.edu"], "company_name": "Space Telescope Science Institute" @@ -33653,6 +34482,10 @@ "company_name": "Tesora", "aliases": ["ParElastic Corp", "ParElastic", "Tesora Inc"] }, + { + "domains": ["tetrate.io"], + "company_name": "Tetrate" + }, { "domains": ["thalesgroup.com", "mythalesgroup.com"], "company_name": "Thales" @@ -33661,6 +34494,10 @@ "domains": ["thoughtworks.com"], "company_name": "ThoughtWorks" }, + { + "domains": ["ticketmaster.com"], + "company_name": "Ticket Master" + }, { "domains": ["ticomm.cn"], "company_name": "TiCOMM" @@ -33690,6 +34527,14 @@ "domains": ["toronto.edu"], "company_name": "University of Toronto" }, + { + "domains": ["treasuredata.com"], + "company_name": "Treasure Data" + }, + { + "domains": ["triggermesh.com"], + "company_name": "TriggerMesh" + }, { "domains": ["tsh-world.co.jp"], "company_name": "TOKYO SYSTEM HOUSE" @@ -33712,6 +34557,10 @@ "company_name": "University of Szeged", "aliases": ["SZTE"] }, + { + "domains": ["uber.com"], + "company_name": "Uber" + }, { "domains": ["ubisoft.com"], "company_name": "Ubisoft", @@ -33724,8 +34573,10 @@ { "domains": ["ucr.edu"], "company_name": "University of California Riverside", - "aliases": ["University of California Riverside", "UC Riverside", - "UCR"] + "aliases": [ + "University of California Riverside", "UC Riverside", + "UCR" + ] }, { "domains": ["ufscar.br"], @@ -33877,10 +34728,18 @@ "domains": ["wanclouds.net"], "company_name": "Wanclouds" }, + { + "domains": ["wandera.com"], + "company_name": "Wandera" + }, { "domains": ["wdc.com"], "company_name": "Western Digital" }, + { + "domains": ["weave.works"], + "company_name": "Weaveworks" + }, { "domains": ["wikimedia.org"], "company_name": "Wikimedia Foundation" @@ -33965,6 +34824,11 @@ "company_name": "Zelin", "aliases": ["zelin.io"] }, + { + "domains": ["zendesk.com"], + "company_name": "Zendesk", + "aliases": ["zendesk.com"] + }, { "domains": ["zetta.io"], "company_name": "Zetta.IO Technology AS", @@ -35837,31 +36701,6 @@ "organization": "kubeflow", "uri": "https://github.com/kubeflow/example-seldon.git" }, - { - "module": "cri-o", - "organization": "kubernetes", - "uri": "https://github.com/kubernetes-incubator/cri-o.git" - }, - { - "module": "cri-tools", - "organization": "kubernetes", - "uri": "https://github.com/kubernetes-incubator/cri-tools.git" - }, - { - "module": "service-catalog", - "organization": "kubernetes", - "uri": "https://github.com/kubernetes-incubator/service-catalog.git" - }, - { - "module": "kube-state-metrics", - "organization": "kubernetes", - "uri": "https://github.com/kubernetes/kube-state-metrics.git" - }, - { - "module": "kargo", - "organization": "kubernetes", - "uri": "https://github.com/kubernetes-incubator/kargo.git" - }, { "module": "kubespray", "organization": "kubernetes-sigs", @@ -36044,6 +36883,11 @@ "organization": "ceph", "uri": "https://github.com/ceph/ceph-ansible.git" }, + { + "module": "concourse", + "organization": "concourse", + "uri": "https://github.com/concourse/concourse.git" + }, { "module": "barbican", "organization": "openstack", @@ -36243,6 +37087,11 @@ } ] }, + { + "module": "kubernetes", + "organization": "kubernetes", + "uri": "git://github.com/kubernetes/kubernetes.git" + }, { "module": "releng", "organization": "opnfv", @@ -36691,7 +37540,71 @@ "module": "trex", "uri": "https://github.com/FDio/trex.git", "organization": "FDio" - + }, + { + "module": "prometheus", + "uri": "https://github.com/prometheus/prometheus.git", + "organization": "Prometheus" + }, + { + "module": "fluentd", + "uri": "https://github.com/fluent/fluentd.git", + "organization": "Fluentd" + }, + { + "module": "grpc", + "uri": "https://github.com/grpc/grpc.git", + "organization": "grpc" + }, + { + "module": "rkt", + "uri": "https://github.com/rkt/rkt.git", + "organization": "rkt" + }, + { + "module": "cni", + "uri": "https://github.com/containernetworking/cni.git", + "organization": "CNI" + }, + { + "module": "envoy", + "uri": "https://github.com/envoyproxy/envoy.git", + "organization": "Envoy Proxy" + }, + { + "module": "jaeger", + "uri": "https://github.com/jaegertracing/jaeger.git", + "organization": "Jaeger" + }, + { + "module": "notary", + "uri": "https://github.com/theupdateframework/notary.git", + "organization": "TUF" + }, + { + "module": "tuf", + "uri": "https://github.com/theupdateframework/tuf.git", + "organization": "TUF" + }, + { + "module": "vitess", + "uri": "https://github.com/vitessio/vitess.git", + "organization": "Vitess" + }, + { + "module": "coredns", + "uri": "https://github.com/coredns/coredns.git", + "organization": "CoreDNS" + }, + { + "module": "linkerd", + "uri": "https://github.com/linkerd/linkerd.git", + "organization": "Linkerd" + }, + { + "module": "helm", + "uri": "https://github.com/helm/helm.git", + "organization": "Helm" }, { "module": "edge-computing", @@ -36803,11 +37716,6 @@ "organization": "cloudfoundry", "uri": "github://" }, - { - "organization": "kubernetes", - "module_group_id": "kubernetes-main-group", - "uri": "github://" - }, { "organization": "kubernetes-sigs", "module_group_id": "kubernetes-sigs-group", @@ -37100,11 +38008,13 @@ "releases": [ { "release_name": "prehistory", - "end_date": "2010-Jan-01" + "end_date": "2010-Jan-01", + "project": "openstack" }, { "release_name": "Austin", "end_date": "2010-Oct-21", + "project": "openstack", "refs": { "governance": { "type": "legacy", @@ -37120,7 +38030,8 @@ "type": "legacy", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/programs.yaml?id=sept-2014-elections" } - } + }, + "project": "openstack" }, { "release_name": "Cactus", @@ -37130,7 +38041,8 @@ "type": "legacy", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/programs.yaml?id=sept-2014-elections" } - } + }, + "project": "openstack" }, { "release_name": "Diablo", @@ -37140,7 +38052,8 @@ "type": "legacy", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/programs.yaml?id=sept-2014-elections" } - } + }, + "project": "openstack" }, { "release_name": "Essex", @@ -37150,7 +38063,8 @@ "type": "legacy", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/programs.yaml?id=sept-2014-elections" } - } + }, + "project": "openstack" }, { "release_name": "Folsom", @@ -37160,7 +38074,8 @@ "type": "legacy", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/programs.yaml?id=sept-2014-elections" } - } + }, + "project": "openstack" }, { "release_name": "Grizzly", @@ -37170,7 +38085,8 @@ "type": "legacy", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/programs.yaml?id=sept-2014-elections" } - } + }, + "project": "openstack" }, { "release_name": "Havana", @@ -37180,7 +38096,8 @@ "type": "legacy", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/programs.yaml?id=sept-2014-elections" } - } + }, + "project": "openstack" }, { "release_name": "Icehouse", @@ -37190,7 +38107,8 @@ "type": "legacy", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/programs.yaml?id=sept-2014-elections" } - } + }, + "project": "openstack" }, { "release_name": "Juno", @@ -37200,7 +38118,8 @@ "type": "legacy", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/programs.yaml?id=sept-2014-elections" } - } + }, + "project": "openstack" }, { "release_name": "Kilo", @@ -37210,7 +38129,8 @@ "type": "early_big_tent", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/projects.yaml?id=april-2015-elections" } - } + }, + "project": "openstack" }, { "release_name": "Liberty", @@ -37220,7 +38140,8 @@ "type": "big_tent", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/projects.yaml?id=sept-2015-elections" } - } + }, + "project": "openstack" }, { "release_name": "Mitaka", @@ -37230,7 +38151,8 @@ "type": "big_tent", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/projects.yaml?id=march-2016-elections" } - } + }, + "project": "openstack" }, { "release_name": "Newton", @@ -37240,7 +38162,8 @@ "type": "big_tent", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/projects.yaml?id=sept-2016-elections" } - } + }, + "project": "openstack" }, { "release_name": "Ocata", @@ -37250,7 +38173,8 @@ "type": "big_tent", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/projects.yaml?id=jan-2017-elections" } - } + }, + "project": "openstack" }, { "release_name": "Pike", @@ -37260,7 +38184,8 @@ "type": "big_tent", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/projects.yaml?id=aug-2017-elections" } - } + }, + "project": "openstack" }, { "release_name": "Queens", @@ -37270,7 +38195,8 @@ "type": "big_tent", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/projects.yaml" } - } + }, + "project": "openstack" }, { "release_name": "Rocky", @@ -37280,7 +38206,8 @@ "type": "big_tent", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/projects.yaml" } - } + }, + "project": "openstack" }, { "release_name": "Stein", @@ -37290,7 +38217,8 @@ "type": "big_tent", "source": "https://git.openstack.org/cgit/openstack/governance/plain/reference/projects.yaml" } - } + }, + "project": "openstack" } ], "mail_lists": [ @@ -37339,9 +38267,100 @@ "modules": ["openstack-others", "unknown"] }, { - "id": "complementary", - "title": "Complementary", - "modules": ["ansible-group", "ceph", "docker-group", "fdio-group", "istio-group", "knative-group", "kubeflow-group", "kubernetes-main-group", "kubernetes-sigs-group", "kubernetes-incubator-group", "kubernetes-client-group", "kubernetes-csi-group", "jclouds", "cloudfoundry", "opnfv", "openlab", "openshift", "ovs", "pypa-group", "spinnaker"] + "id": "cncf-group", + "title": "CNCF", + "modules": ["kubernetes", "prometheus", "fluentd", "grpc", "rkt", "vitess", "coredns", "linkerd", "helm", "cni", "envoy", + "jaeger", "notary", "tuf"] + }, + { + "id": "kubernetes", + "title": "Kubernetes", + "child": true, + "modules": ["kubernetes"] + }, + { + "id": "prometheus", + "title": "Prometheus", + "child": true, + "modules": ["prometheus"] + }, + { + "id": "fluentd", + "title": "Fluentd", + "child": true, + "modules": ["fluentd"] + }, + { + "id": "grpc", + "title": "GRPC", + "child": true, + "modules": ["grpc"] + }, + { + "id": "rkt", + "title": "rkt", + "child": true, + "modules": ["rkt"] + }, + { + "id": "vitess", + "title": "Vitess", + "child": true, + "modules": ["vitess"] + }, + { + "id": "coredns", + "title": "coredns", + "child": true, + "modules": ["coredns"] + }, + { + "id": "linkerd", + "title": "linkerd", + "child": true, + "modules": ["linkerd"] + }, + { + "id": "helm", + "title": "helm", + "child": true, + "modules": ["helm"] + }, + { + "id": "cni", + "title": "cni", + "child": true, + "modules": ["cni"] + }, + { + "id": "envoy", + "title": "envoy", + "child": true, + "modules": ["envoy"] + }, + { + "id": "jaeger", + "title": "jaeger", + "child": true, + "modules": ["jaeger"] + }, + { + "id": "notary", + "title": "notary", + "child": true, + "modules": ["notary"] + }, + { + "id": "tuf", + "title": "tuf", + "child": true, + "modules": ["tuf"] + }, + { + "id": "unaffiliated", + "title": "Other Projects", + "modules": ["ansible-group", "ceph", "concourse", "docker-group", "fdio-group", "istio-group", "knative-group", + "kubeflow-group", "jclouds", "cloudfoundry", "opnfv", "openlab", "openshift", "ovs", "pypa-group", "spinnaker", "kubernetes-group"] }, { "id": "ansible-group", @@ -37369,9 +38388,9 @@ }, { "id": "kubernetes-group", - "title": "Kubernetes", + "title": "Kubernetes Related", "child": true, - "modules": ["kubernetes-main-group", "kubernetes-sigs-group", "kubernetes-incubator-group", "kubernetes-client-group", "kubernetes-csi-group"] + "modules": ["kubernetes-sigs-group", "kubernetes-incubator-group", "kubernetes-client-group", "kubernetes-csi-group"] }, { "id": "istio-group", diff --git a/stackalytics/dashboard/helpers.py b/stackalytics/dashboard/helpers.py index e7a1cc22e..9c22e8c4e 100644 --- a/stackalytics/dashboard/helpers.py +++ b/stackalytics/dashboard/helpers.py @@ -30,10 +30,10 @@ INFINITY_HTML = '∞' def _extend_author_fields(record): record['author_link'] = make_link( - record['author_name'], '/', + record['author_name'], '', {'user_id': record['user_id'], 'company': ''}) record['company_link'] = make_link( - record['company_name'], '/', + record['company_name'], '', {'company': record['company_name'], 'user_id': ''}) @@ -41,7 +41,7 @@ def _extend_record_common_fields(record): _extend_author_fields(record) record['date_str'] = format_datetime(record['date']) record['module_link'] = make_link( - record['module'], '/', + record['module'], '', {'module': record['module'], 'company': '', 'user_id': ''}) record['blueprint_id_count'] = len(record.get('blueprint_id', [])) record['bug_id_count'] = len(record.get('bug_id', [])) @@ -124,7 +124,7 @@ def extend_user(user): if user['companies']: company_name = get_current_company(user) user['company_link'] = make_link( - company_name, '/', {'company': company_name, 'user_id': ''}) + company_name, '', {'company': company_name, 'user_id': ''}) else: user['company_link'] = '' @@ -286,7 +286,7 @@ def make_link(title, uri=None, options=None): if param_values: uri += '?' + '&'.join(['%s=%s' % (n, utils.safe_encode(v)) for n, v in six.iteritems(param_values)]) - return '%(title)s' % {'uri': uri, 'title': title} + return {'uri': uri, 'title': title} def make_blueprint_link(module, name): diff --git a/stackalytics/dashboard/static/css/style.css b/stackalytics/dashboard/static/css/style.css index ff61af88b..5b7d203b5 100644 --- a/stackalytics/dashboard/static/css/style.css +++ b/stackalytics/dashboard/static/css/style.css @@ -1,9 +1,10 @@ html, body { - font-family: 'PT Sans', arial, sans-serif; + font-family: 'Roboto', sans-serif; font-size: 14px; height: 100%; color: #41454d; margin: 0; + background: #fff; } a { @@ -22,13 +23,9 @@ p { margin: 6px 0px 15px 0px; } -div.page { - width: 960px; - margin: 0 auto; -} h2 { - font-family: 'PT Sans Narrow', 'Arial Narrow', arial, sans-serif; + font-family: 'Roboto', sans-serif; font-size: 23px; font-weight: normal; font-style: normal; @@ -38,7 +35,7 @@ h2 { } h3 { - font-family: 'PT Sans Narrow', 'Arial Narrow', arial, sans-serif; + font-family: 'Roboto', sans-serif; font-size: 19px; font-weight: normal; font-style: normal; @@ -47,7 +44,7 @@ h3 { } h4 { - font-family: 'PT Sans Narrow', 'Arial Narrow', arial, sans-serif; + font-family: 'Roboto', sans-serif; font-size: 16px; font-weight: bold; font-style: normal; @@ -88,26 +85,15 @@ input[type="submit"] { } div.drops { - height: 60px; margin-top: 10px; + margin-bottom: 25px; } -div.drop label { - color: #909cb5; -} - -.drop { - height: 30px; - float: left; - margin-right: 23px; -} - -.drop:last-child { - margin-right: 0; -} - -.drop label { - display: block; +.drops label { + color: #90a4b7; + font-weight: 300; + text-transform: uppercase; + white-space: nowrap; } div.aheader { @@ -130,12 +116,10 @@ div.aheader h1 a { } div.page div.navigation { - text-shadow: 1px 1px 0 #fff; - padding: 4px 10px; - border-top: 1px dashed #e9eaef; - border-bottom: 1px dashed #e9eaef; - color: #909cb5; - font-size: 10pt; + padding: 10px; + margin: 35px 0 5px; + background: #fff; + box-shadow: 0px 0px 20px 0px rgba(0,0,0,0.1); } div.page div.navigation a { @@ -215,8 +199,17 @@ a[target]:not([target='']):after, .ext_link:after { opacity: 0.3; } +#analytics_header a:after { + content: ""; + opacity: 1; +} + +#analytics_header { + position: relative; +} + #analytics_header #logo { - font-family: 'PT Sans', 'Arial Narrow', arial, sans-serif; + font-family: 'Roboto', sans-serif; font-weight: bolder; font-style: normal; font-size: 30px; @@ -226,6 +219,14 @@ a[target]:not([target='']):after, .ext_link:after { padding-right: 10px; } +#analytics_header #logo { + margin-top: 18px; +} + +#analytics_header #logo a img { + max-width: 100%; +} + #analytics_header #slogan { font-family: georgia, serif; font-weight: lighter; @@ -406,75 +407,180 @@ body .ui-tooltip { opacity: 0.8; } -/* new top menu */ -ul#menu-stackamenu { - margin: 0; - padding: 0; - list-style-image: none; - list-style-type: none; - font-family: 'PT Sans Narrow', arial, sans-serif; +div#company_container, +div#engineer_container, +div#module_container, +div#module_details_container, +div#contribution_container, +div#user_profile_container, +div#activity_container, +div#users_table_wrapper, +div#companies_container, +div#individuals_container, +div#new_compaines_container, +div#affiliation_container, +div#members_container { + background: #fff; + margin: 25px 0; + border: 1px solid #d9d9e2; + padding: 30px; } -ul#menu-stackamenu li { +/* +div#company_container table.dataTable.display tbody td, +div#engineer_container table.dataTable.display tbody td, +div#module_container table.dataTable.display tbody td, +div#module_details_container table.dataTable.display tbody td, +div#contribution_container table.dataTable.display tbody td, +div#user_profile_container table.dataTable.display tbody td, +div#activity_container table.dataTable.display tbody td, +div#users_table_wrapper table.dataTable.display tbody td, +div#companies_container table.dataTable.display tbody td, +div#individuals_container table.dataTable.display tbody td, +div#new_compaines_container table.dataTable.display tbody td, +div#affiliation_container table.dataTable.display tbody td, +div#members_container table.dataTable.display tbody td { + white-space: nowrap; +} +*/ + +div#company_container .pad, +div#engineer_container .pad, +div#module_container .pad, +div#module_details_container .pad, +div#contribution_container .pad, +div#user_profile_container .pad, +div#activity_container .pad, +div#users_table_wrapper .pad, +div#companies_container .pad, +div#individuals_container .pad, +div#new_compaines_container .pad, +div#affiliation_container .pad, +div#members_container .pad { + padding: 15px; +} + +div#affiliation_container > div#users_table_wrapper { + box-shadow: none; +} + +div#company_container h2, +div#engineer_container h2, +div#module_container h2, +div#module_details_container h2, +div#contribution_container h2, +div#user_profile_container h2, +div#activity_container h2, +div#companies_container h2, +div#individuals_container h2, +div#new_compaines_container h2, +div#members_container h2 { + color: #1c1c1c; + margin-bottom: 35px; +} + +#company_chart, #module_chart { + padding-top: 0; + width:100%; + min-height: 450px; +} + +@media (max-width: 1199px) { + #company_chart, #module_chart { + padding-top: 0; + } + div#company_container h2, + div#engineer_container h2, + div#module_container h2, + div#module_details_container h2, + div#contribution_container h2, + div#user_profile_container h2, + div#activity_container h2, + div#companies_container h2, + div#individuals_container h2, + div#new_compaines_container h2, + div#members_container h2 { + text-align: center; + } +} + +div#affiliation_container h1 { + margin-bottom: 25px; +} + +div#footer_container { + background: #fff; + margin: 25px 0; + padding: 15px; + font-size: smaller; +} + +/* new top menu */ +#menu-stackamenu { margin: 0; padding: 0; - display: inline-block; + font-family: 'Roboto', sans-serif; } div.stackamenu { - text-align: left; - padding-bottom: 10px; - margin-left: 240px; + margin: 15px 0 30px; } -div.stackamenu a { +#menu-stackamenu li a { display: inline-block; - color: #972D24; - border-radius: 0; + color: #55575c; font-size: 18px; - /*text-transform: uppercase;*/ - margin: 5px 0; - padding: 5px 20px; - background: #eceef3; - /*box-shadow: inset 0 1px 1px rgba(255, 255, 255, 0.7);*/ + padding: 10px; + font-weight: 300; + margin: 0 15px; } -div.stackamenu a span { - color: #943a3a; +#menu-stackamenu li a span { + color: #55575c; font-size: 110%; position: relative; top: 2px; - margin-right: 10px; } -div.stackamenu a:hover { - background: #c8e7ed; - /*color: white;*/ +#menu-stackamenu li a:hover, #menu-stackamenu li a:active, #menu-stackamenu li a:focus { + text-decoration: none; + border-bottom: 2px solid #ed1944; } -div.stackamenu a:hover span { +#menu-stackamenu li a:hover span { /*background: #c8e7ed;*/ /*color: white;*/ /*text-shadow: 0 -1px 0 #2c96c5;*/ } -div.stackamenu li.current-menu-item a { - background: #4bb2c5; - color: white; - /*box-shadow: 0 3px 0 #436281;*/ +a.about { + color: #16c3de; + text-transform: lowercase; + border: 2px solid white; + border-radius: 20px; + padding: 2px 10px; + font-size: smaller; + position: absolute; + top: 30px; } -div.stackamenu li.current-menu-item a:hover { +a.about:hover, a.about:active, a.about:focus { + background: #16c3de; + color: #fff; + border-color: #16c3de; +} + +#menu-stackamenu .current-menu-item a { + border-bottom: 2px solid #ed1944; +} + +#menu-stackamenu li .current-menu-item a:hover, #menu-stackamenu li .current-menu-item a:active, #menu-stackamenu li .current-menu-item a:focus { background: #4bb2c5; + text-decoration: none; /*color: white;*/ /*box-shadow: 0 3px 0 #2b99ca;*/ } -div.stackamenu li.current-menu-item a span { - color: white; - /*text-shadow: 0 -1px 0 #436281;*/ -} - .select2-loading { font-style: italic; color: dimgray; @@ -506,4 +612,512 @@ div.stackamenu li.current-menu-item a span { .disabled { color: grey; -} \ No newline at end of file +} + +table.dataTable tbody tr { + background-color: #f6fafd; + font-weight: 300; +} + +table.dataTable tbody tr a { + color: #727272; +} + +table.dataTable.display tbody tr.even>.sorting_1, table.dataTable.order-column.stripe tbody tr.even>.sorting_1 { + background-color: #edf4fc; +} + +table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { + background-color: #fff; +} + +table.dataTable.display tbody tr.odd>.sorting_1, table.dataTable.order-column.stripe tbody tr.odd>.sorting_1 { + background-color: #f5fafe; +} + +table.dataTable.display tbody tr td:first-child { + color: #c2d3dc; +} + +table.dataTable.display tbody tr td:last-child { + color: #9da2a6; +} + +table.dataTable.no-footer { + border-bottom: none; +} + +table.dataTable thead th, table.dataTable thead td { + padding: 10px 18px; + border-bottom: 3px solid #e7f3fe; +} + +.dataTables_filter, .dataTables_length, .dataTables_paginate { + display: inline-block; +} + +.dataTables_paginate .paginate_button { + /* border: none; + border-radius: 50%; */ +} + +.dataTables_paginate .paginate_button:hover { + /* color: #000 !important; + border: none; + background-color: #fff; + background: #fff; + box-shadow: 0px 1px 1px 1px rgba(0,0,0,.3) inset; */ +} + +.dataTables_paginate .paginate_button:active { + /* outline: none; + background-color: #16c3de; + background: #16c3de; + box-shadow: none; */ +} + +.dataTables_paginate .paginate_button.current, .dataTables_paginate .paginate_button.current:hover { + /* color: #fff !important; + border: none; + background-color: #14c3de; + background: #14c3de; + border-radius: 50%; + transition: box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1); + transition-delay: 0.2s; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); */ + font-weight: bold; +} + +.select2-container--material { + width: 100% !important; + /** + * Textbox + */ + /** + * Dropdown + */ + /** + * Options + */ + /** + * Focused textbox + */ + /** + * Disabled textbox + */ +} +.select2-container--material ::-webkit-input-placeholder { + color: inherit; +} +.select2-container--material :-ms-input-placeholder { + color: inherit; +} +.select2-container--material :-ms-input-placeholder { + color: inherit; +} +.select2-container--material ::placeholder { + color: inherit; +} +.select2-container--material .select2-selection { + /* @extend input */ + overflow: visible; + font: inherit; + touch-action: manipulation; + margin: 0; + line-height: inherit; + border-radius: 0; + box-sizing: inherit; + /* @extend .form-control */ + display: block; + width: 100%; + color: #55595c; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + padding: .5rem 0 .6rem; + font-size: 1rem; + line-height: 1.5; + background-color: transparent; + background-image: none; + border-radius: 0; + margin-top: .2rem; + margin-bottom: 1rem; + /* @extend input[type=text] */ + background-color: transparent; + border: none; + border-bottom: 1px solid #ccc; + border-radius: 0; + outline: 0; + width: 100%; + font-size: 1rem; + box-shadow: none; + transition: all .3s; + min-height: 2.1rem; +} +.select2-container--material .select2-selection .select2-selection__rendered { + padding-left: 0; +} +.select2-container--material .select2-selection--single .select2-selection__rendered { + float: left; +} +.select2-container--material .select2-selection--single .select2-selection__arrow { + float: right; +} +.select2-container--material .select2-selection--multiple { + /** + * Multiple selected options + */ + /** + * Multiple selected option clear button + */ +} +.select2-container--material .select2-selection--multiple .select2-selection__rendered { + width: 100%; +} +.select2-container--material .select2-selection--multiple .select2-selection__rendered li { + list-style: none; +} +.select2-container--material .select2-selection--multiple .select2-selection__choice { + /* @extend .mdl-chip */ + height: 32px; + line-height: 32px; + padding: 0 12px; + border: 0; + border-radius: 16px; + background-color: #dedede; + display: inline-block; + color: rgba(0, 0, 0, 0.87); + margin: 2px 0; + font-size: 0; + white-space: nowrap; + /* @extend .mdl-chip__text */ + font-size: 13px; + vertical-align: middle; + display: inline-block; + float: left; + margin-right: 8px; + margin-bottom: 4px; +} +.select2-container--material .select2-selection--multiple .select2-selection__choice__remove { + /* Hide default content */ + font-size: 0; + opacity: 0.38; + cursor: pointer; + float: right; + margin-top: 4px; + margin-right: -6px; + margin-left: 6px; + transition: opacity; +} +.select2-container--material .select2-selection--multiple .select2-selection__choice__remove::before { + content: "cancel"; + /* @extend .material-icons */ + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -webkit-font-feature-settings: 'liga'; + -webkit-font-smoothing: antialiased; + color: #000; +} +.select2-container--material .select2-selection--multiple .select2-selection__choice__remove:hover { + opacity: 0.54; +} +.select2-container--material .select2-search--inline .select2-search__field { + width: 100%; + margin-top: 0; + /* Match input[type=text] */ + height: 34px; + line-height: 1; +} +.select2-container--material .select2-dropdown { + border: 0; +} +.select2-container--material .select2-dropdown .select2-search__field { + min-height: 2.1rem; + margin-bottom: 16px; + border: 0; + border-bottom: 1px solid #ccc; + transition: all .3s; +} +.select2-container--material .select2-dropdown .select2-search__field:focus { + border-bottom: 1px solid #4285f4; + box-shadow: 0 1px 0 0 #4585f4; +} +.select2-container--material .select2-results__options { + /* @extend .zf-shadow-depth* */ + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); + /* @extend .dropdown-content */ + background-color: #fff; + margin: 0; + min-width: 100px; + max-height: 650px; + overflow-y: auto; + z-index: 999; + will-change: width,height; + /* @extend .dropdown-content inline styles */ +} +.select2-container--material .select2-results__option { + /* @extend .dropdown-content li */ + cursor: pointer; + clear: both; + color: rgba(0, 0, 0, 0.87); + line-height: 1.5rem; + text-align: left; + text-transform: none; + /* @extend .dropdown-content li>a, .dropdown-content li>span */ + font-size: 1.2rem; + display: block; + padding: 1rem; + /** + * Disabled options + */ + /** + * Selected option + */ + /** + * Active/hovered option + */ +} +.select2-container--material .select2-results__option[aria-disabled=true] { + /* @extend .select-dropdown li.disabled */ + color: rgba(0, 0, 0, 0.3); + background-color: transparent !important; + cursor: context-menu; + /* @extend .disabled */ + cursor: not-allowed; +} +.select2-container--material .select2-results__option[aria-selected=true] { + /* @extend .dropdown-content li:active, .dropdow-content li:hover */ + color: #4285f4; + background-color: #eee; +} +.select2-container--material .select2-results__option--highlighted[aria-selected] { + background-color: #ddd; +} +.select2-container--material.select2-container--focus .select2-selection { + /* @extend input[type=text]:focus */ + border-bottom: 1px solid #4285f4; + box-shadow: 0 1px 0 0 #4585f4; +} +.select2-container--material.select2-container--disabled .select2-selection { + /* @extend .select-wrapper input.select-dropdown:disabled */ + color: rgba(0, 0, 0, 0.3); + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border-bottom: 1px solid rgba(0, 0, 0, 0.3); +} +.select2-container--material.select2-container--disabled.select2-container--focus .select2-selection { + box-shadow: none; +} + + + +span.chartColor { + height: 10px; + width: 10px; + display: inline-block; + margin-right: 5px; + border-radius: 50%; +} + +.dataTables_filter, .dataTables_length, .dataTables_paginate { + display: inline-block; + float: right; +} + +.container_footer { + /* background: #f2f3f7; + background: -moz-linear-gradient(top, #f2f3f7 0%, #f4f2f6 100%); + background: -webkit-linear-gradient(top, #f2f3f7 0%,#f4f2f6 100%); + background: linear-gradient(to bottom, #f2f3f7 0%,#f4f2f6 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f2f3f7', endColorstr='#f4f2f6',GradientType=0 ); + */ + padding: 15px; +} + + +@media (min-width: 576px) { + .container-fluid { + max-width: 540px; + } +} + +@media (min-width: 768px) { + .container-fluid { + max-width: 720px; + } +} + +@media (min-width: 992px) { + .container-fluid { + max-width: 960px; + } +} + +@media (min-width: 1260px) { + .container-fluid { + max-width: 1140px; + } +} + +@media (min-width: 1480px) { + .container-fluid { + max-width: 100%; + } + .container-fluid-padding { padding: 0 60px; } +} + +.dataTables_length label { + /* color: #bacbd6; */ +} + +.dataTables_length label select { + /* background: #fff; + padding: 5px; + color: #4abed5; + border: none; + margin-left: 5px; */ +} + +#engineer_table tbody tr td:nth-child(3) { + color: #c97b7a; +} +#engineer_table tbody tr td:nth-child(4) { + color: #d1c17d; +} +#engineer_table tbody tr td:nth-child(5) { + color: #b1c361; +} +#engineer_table tbody tr td:nth-child(6) { + color: #9dd493; +} +#engineer_table tbody tr td:nth-child(7) { + color: #195d15; +} +#engineer_table tbody tr td:nth-child(8) { + color: #940e0d; +} +#engineer_table tbody tr td:nth-child(9) span { + color: #fff; + background: #05b175; + border-radius: 50%; + padding: 8px 4px; + font-size: smaller; + display: inline-block; + height: 30px; + width: 30px; + text-align: center; +} + +#engineer_table tbody tr td:nth-child(9) span.red { + background: red; +} +.dataTables_filter input[type="search"] { + padding: 5px; + border: 1px solid #ccc; + max-width: 150px; +} + +.dataTables_filter input[type="search"]::placeholder { + /* color: #c5d9e4; */ +} + +.dataTables_paginate .paginate_button { + border: none; + border-radius: 50%; + display: inline-block; + padding: 3px 10px; + cursor: pointer; + margin: 0 2px; + color: #aec4d0; +} + +.dataTables_paginate .paginate_button:hover, .dataTables_paginate .paginate_button:active .dataTables_paginate .paginate_button:focus { + text-decoration: none; + color: #aec4d0; +} + +.dataTables_paginate { + /* text-align: right; */ +} + +table.dataTable tbody th, table.dataTable tbody td { + padding: 5px 10px; +} + +table.dataTable tbody tr td:nth-child(1) { + padding: 5px; +} + +table.dataTable thead .sorting { + background: none; + padding: 4px 2px 4px 10px; + background: #00c3e0; + color: #fff; +} + +table.dataTable thead .sorting_desc, table.dataTable thead .sorting_asc { + background: none; + padding: 4px 2px 4px 4px; + background: #00c3e0; + color: #fff; +} + +table.dataTable thead .sorting:nth-of-type(1) { + padding: 4px 2px 4px 5px; +} + + +.select2-drop, .select2-container .select2-choice { + border-radius: 0; +} + +.select2-container .select2-choice { + height: 30px; + line-height: 30px; + background: #fff; + background-image: none; + border: 1px solid #c6c2c2; +} + +.select2-container .select2-dropdown-open .select2-choice { + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee)); + background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%); + background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%); + background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%); + background-image: -ms-linear-gradient(top, #ffffff 0%,#eeeeee 50%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 ); + background-image: linear-gradient(top, #ffffff 0%,#eeeeee 50%); +} + +.select2-container .select2-choice .select2-arrow { + background: #f5f5f5; + background-image: none; + border-radius: 0; + border-left: 1px solid #c6c2c2; + width: 23px; +} + +.select2-container.select2-dropdown-open .select2-choice .select2-arrow { + background: transparent; + border-left: 1px solid transparent; +} + +.select2-container .select2-choice .select2-arrow b { + background-position-x: 3px; +} + +.select2-drop-active, .select2-container-active .select2-choice, .select2-container-active .select2-choices { + border-color: #00c3e0; +} + diff --git a/stackalytics/dashboard/static/images/android-chrome-192x192.png b/stackalytics/dashboard/static/images/android-chrome-192x192.png new file mode 100644 index 000000000..585ffa7f5 Binary files /dev/null and b/stackalytics/dashboard/static/images/android-chrome-192x192.png differ diff --git a/stackalytics/dashboard/static/images/android-chrome-256x256.png b/stackalytics/dashboard/static/images/android-chrome-256x256.png new file mode 100644 index 000000000..bf3474e9c Binary files /dev/null and b/stackalytics/dashboard/static/images/android-chrome-256x256.png differ diff --git a/stackalytics/dashboard/static/images/apple-touch-icon.png b/stackalytics/dashboard/static/images/apple-touch-icon.png new file mode 100644 index 000000000..f8ea18883 Binary files /dev/null and b/stackalytics/dashboard/static/images/apple-touch-icon.png differ diff --git a/stackalytics/dashboard/static/images/browserconfig.xml b/stackalytics/dashboard/static/images/browserconfig.xml new file mode 100644 index 000000000..5cd27e3f1 --- /dev/null +++ b/stackalytics/dashboard/static/images/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #603cba + + + diff --git a/stackalytics/dashboard/static/images/favicon-16x16.png b/stackalytics/dashboard/static/images/favicon-16x16.png new file mode 100644 index 000000000..237643a04 Binary files /dev/null and b/stackalytics/dashboard/static/images/favicon-16x16.png differ diff --git a/stackalytics/dashboard/static/images/favicon-32x32.png b/stackalytics/dashboard/static/images/favicon-32x32.png new file mode 100644 index 000000000..7b64ba006 Binary files /dev/null and b/stackalytics/dashboard/static/images/favicon-32x32.png differ diff --git a/stackalytics/dashboard/static/images/favicon.ico b/stackalytics/dashboard/static/images/favicon.ico new file mode 100644 index 000000000..36ae91bcc Binary files /dev/null and b/stackalytics/dashboard/static/images/favicon.ico differ diff --git a/stackalytics/dashboard/static/images/favicon.png b/stackalytics/dashboard/static/images/favicon.png index 2c7467c1c..7b64ba006 100644 Binary files a/stackalytics/dashboard/static/images/favicon.png and b/stackalytics/dashboard/static/images/favicon.png differ diff --git a/stackalytics/dashboard/static/images/mstile-150x150.png b/stackalytics/dashboard/static/images/mstile-150x150.png new file mode 100644 index 000000000..ee8020914 Binary files /dev/null and b/stackalytics/dashboard/static/images/mstile-150x150.png differ diff --git a/stackalytics/dashboard/static/images/safari-pinned-tab.svg b/stackalytics/dashboard/static/images/safari-pinned-tab.svg new file mode 100644 index 000000000..13cbcdaf6 --- /dev/null +++ b/stackalytics/dashboard/static/images/safari-pinned-tab.svg @@ -0,0 +1,24 @@ + + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + + diff --git a/stackalytics/dashboard/static/images/select2.png b/stackalytics/dashboard/static/images/select2.png index 1d804ffb9..de57fefef 100644 Binary files a/stackalytics/dashboard/static/images/select2.png and b/stackalytics/dashboard/static/images/select2.png differ diff --git a/stackalytics/dashboard/static/images/select2old.png b/stackalytics/dashboard/static/images/select2old.png new file mode 100644 index 000000000..1d804ffb9 Binary files /dev/null and b/stackalytics/dashboard/static/images/select2old.png differ diff --git a/stackalytics/dashboard/static/images/site.webmanifest b/stackalytics/dashboard/static/images/site.webmanifest new file mode 100644 index 000000000..de65106f4 --- /dev/null +++ b/stackalytics/dashboard/static/images/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-256x256.png", + "sizes": "256x256", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/stackalytics/dashboard/static/images/stackalytics_logo.png b/stackalytics/dashboard/static/images/stackalytics_logo.png index 5d5ca9a86..2bcfe01d9 100644 Binary files a/stackalytics/dashboard/static/images/stackalytics_logo.png and b/stackalytics/dashboard/static/images/stackalytics_logo.png differ diff --git a/stackalytics/dashboard/static/js/stackalytics-ui.js b/stackalytics/dashboard/static/js/stackalytics-ui.js index adcb8eefb..9cb69638b 100644 --- a/stackalytics/dashboard/static/js/stackalytics-ui.js +++ b/stackalytics/dashboard/static/js/stackalytics-ui.js @@ -15,14 +15,18 @@ limitations under the License. */ -String.prototype.trunc = - function (n) { - if (this.length <= n) return this; - return this.substr(0, this.substr(0, n).lastIndexOf(' ')) + "…"; - }; + +function stringTrunc(string, length) { + + if (string.length <= length) { + return string; + } + + return string.substr(0, string.substr(0, length).lastIndexOf(' ')) + "..."; +} function _createTimeline(data) { - var plot_attrs = { + var plot = $.jqplot('timeline', data, { gridPadding: { right: 35 }, @@ -47,6 +51,10 @@ function _createTimeline(data) { yaxis: { min: 0, label: '' + }, + y2axis: { + min: 0, + label: '' } }, series: [ @@ -61,30 +69,21 @@ function _createTimeline(data) { fill: true, color: '#4bb2c5', fillColor: '#4bb2c5' - } - ] - } - /* add the secondary line only if it is has positive values */ - var has_2 = false; - for (var i=0; i 0) { - has_2 = true; - break; - } - } - if (has_2) { - plot_attrs.axes.y2axis = {min: 0, label: ''}; - plot_attrs.series.push({ + }, + { shadow: false, lineWidth: 1.5, showMarker: true, - markerOptions: { size: 5 }, + markerOptions: {size: 5}, yaxis: 'y2axis' - }); - } else { - data.pop(); - } - $.jqplot('timeline', data, plot_attrs); + } + ] + }); + + $('.navigation').resize(function () { + plot.replot({resetAxes: true}); + }) + } function renderTimeline(options) { @@ -109,6 +108,8 @@ function renderTableAndChart(url, container_id, table_id, chart_id, link_param, success: function (data) { var tableData = []; + //var chartData = [['name', 'metric']]; + var chartData = []; const limit = 10; @@ -124,14 +125,14 @@ function renderTableAndChart(url, container_id, table_id, chart_id, link_param, for (i = 0; i < data.length; i++) { if (i < limit - 1) { - chartData.push([data[i].name.trunc(36), data[i].metric]); + chartData.push([stringTrunc(data[i].name, 36), data[i].metric]); } else { aggregate += data[i].metric; } if (!data[i].link) { if (data[i].id) { - data[i].link = makeLink(data[i].id, data[i].name, link_param); + data[i].link = makeLink(data[i].id, data[i].name, link_param, true); } else { data[i].link = data[i].name } @@ -147,7 +148,7 @@ function renderTableAndChart(url, container_id, table_id, chart_id, link_param, } if (i == limit) { - chartData.push([data[i - 1].name.trunc(36), data[i - 1].metric]); + chartData.push([stringTrunc(data[i - 1].name, 36), data[i - 1].metric]); } else if (i > limit) { chartData.push(["others", aggregate]); } @@ -166,30 +167,131 @@ function renderTableAndChart(url, container_id, table_id, chart_id, link_param, if (table_id) { $("#" + table_id).dataTable({ + "oLanguage": { + "sLengthMenu": "Show _MENU_ entries", + "sSearch": "", + //"oPaginate": { + // "sPrevious": "<", + // "sNext": ">" + //} + }, "aLengthMenu": [ [10, 25, 50, -1], [10, 25, 50, "All"] ], "aaSorting": [ - [ sort_by_column, "desc" ] + [sort_by_column, "desc"] ], - "sPaginationType": "full_numbers", - "iDisplayLength": 10, + "sPaginationType": "simple", + "iDisplayLength": chart_id == 10, "aaData": tableData, - "aoColumns": tableColumns + "aoColumns": tableColumns, + "autoWidth": false, + //"sDom": '<"H"r><"clear">t<"F"pfl>', + "fnCreatedRow": function (row, data, dataIndex) { + + var colors = [ + "#754998", + "#d32473", + "#0090cd", + "#d12148", + "#f68121", + "#faef01", + "#b7cd44", + "#764a99", + "#d12148", + "#43cd6e" + ] + + if (dataIndex < 9 && table_id != 'engineer_table') { + var span = $('', { + class: 'chartColor', + style: 'background-color: ' + colors[dataIndex] + }); + + $(row).children("td:nth-child(2)").prepend(span); + } + + if (table_id == 'engineer_table') { + var value = Number($(row).children("td:nth-child(9)").text().replace('%', '')); + var color = 'green'; + if (value < 60) { + color = 'red'; + } + $(row).children("td:nth-child(9)").html('' + $(row).children("td:nth-child(9)").text().replace('%', '') + ''); + } + }, + "fnDrawCallback": function () { + //$('#' + table_id + ' thead .sorting:first-child, #'+ table_id + ' thead .sorting:nth-child(2)').text('').removeClass('sorting'); + //$('#' + table_id).parent().find('div:last-child').prependTo($('#' + table_id).parent().parent().parent().parent().parent().find('.container_footer')); + $(".dataTables_filter input").attr("placeholder", "Search"); + if (table_id != 'engineer_table') { + + $('#' + table_id + ' tbody tr td:nth-child(2) a').hover(function () { + if (chart.data($(this).text()).length != 0) { + chart.focus($(this).text()); + } + }, function () { + if (chart.data($(this).text()).length != 0) { + chart.focus(); + } + }); + } + } }); } - if (chart_id) { - var plot = $.jqplot(chart_id, [chartData], { - seriesDefaults: { - renderer: jQuery.jqplot.PieRenderer, - rendererOptions: { - showDataLabels: true + if (chart_id && chart_id != 'engineer_chart') { + var colors = [ + "#754998", + "#d32473", + "#0090cd", + "#d12148", + "#f68121", + "#faef01", + "#b7cd44", + "#764a99", + "#d12148", + "#43cd6e" + ]; + var chartColors = {}; + for (var i = 0; i < chartData.length; i++) { + chartColors[chartData[i][0]] = colors[i]; + } + + var chart = c3.generate({ + bindto: d3.select("#" + chart_id), + legend: { + hide: true + }, + tooltip: { + format: { + value: function (value, ratio, id, index) { + return value; + } } }, - legend: { show: true, location: 'e' } + pie: { + expand: false + }, + data: { + selection: { + enabled: true + }, + columns: chartData, + type: "pie", + colors: chartColors, + onclick: function (d, i) { + var link = $('a[data-chart="' + d.name + '"]'); + var href = $(link).attr('href'); + + if (link.length > 0 && href !== undefined) { + window.location.href = href; + } + }, + } }); + } } }); @@ -220,7 +322,7 @@ function renderBarChart(chart_id, chart_data) { function renderPunchCard(chart_id, chart_data) { $.jqplot(chart_id, chart_data, { - seriesDefaults:{ + seriesDefaults: { renderer: $.jqplot.BubbleRenderer, rendererOptions: { varyBubbleColors: false, @@ -240,7 +342,9 @@ function renderPunchCard(chart_id, chart_data) { labelRenderer: $.jqplot.CanvasAxisLabelRenderer, tickOptions: { formatter: function (format, val) { - if (val < 0 || val > 23) { return "" } + if (val < 0 || val > 23) { + return "" + } return val; } } @@ -250,7 +354,9 @@ function renderPunchCard(chart_id, chart_data) { labelRenderer: $.jqplot.CanvasAxisLabelRenderer, tickOptions: { formatter: function (format, val) { - if (val < 0 || val > 6) { return "" } + if (val < 0 || val > 6) { + return "" + } var labels = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"].reverse(); return labels[val]; } @@ -272,7 +378,7 @@ function extendWithGravatar(record, image_size) { record.gravatar = $.gravatarImageURI(gravatar, { "image": "wavatar", "rating": "g", - "size": image_size? image_size: 64 + "size": image_size ? image_size : 64 }); } @@ -292,7 +398,7 @@ function extendWithTweet(record) { tweet = record.author_name + " abandoned patch in " + record.module; } else { var smile = [";(", ":(", "", ":)", ":D"][record.value + 2]; - tweet = "Got " + ((record.value > 0)? "+": "") + record.value + " from " + record.author_name + " on patch in " + record.module + smile; + tweet = "Got " + ((record.value > 0) ? "+" : "") + record.value + " from " + record.author_name + " on patch in " + record.module + smile; } } else if (record.record_type == "review") { tweet = record.status + " change request by " + record.author_name + " in " + record.module; @@ -326,26 +432,58 @@ function getUrlVars() { return vars; } -function makeLink(id, title, param_name) { +function makeLink(id, title, param_name, data_attr) { var options = {}; + var data = ""; + if (data_attr) { + data = ' data-chart="' + title + '" '; + } options[param_name] = id.toLowerCase(); - var link = makeURI("/", options); - return "" + title + "" + var link = makeURI("/" + window.location.pathname.split('/')[1], options); + return "" + title + "" } function makeURI(uri, options) { var ops = {}; + + if (window.location.pathname.split('/')[1] == 'cncf') { + ops = makeDate({project_type: "cncf-group", release: "all", metric: "commits"}); + } + + if (window.location.pathname.split('/')[1] == 'unaffiliated') { + ops = makeDate({project_type: "unaffiliated", release: "all", metric: "commits"}); + } + $.extend(ops, getUrlVars()); if (options != null) { $.extend(ops, options); } - var str = $.map(ops,function (val, index) { + var str = $.map(ops, function (val, index) { return index + "=" + encodeURI(("" + val).replace("&", "")).toLowerCase(); }).join("&"); return (str == "") ? uri : uri + "?" + str; } +function makeDate(ops) { + var date = getUrlVars()['date']; + + var result = {}; + + if (!date || date == 'all') { + return ops; + } + + var end_date = new Date(); + var start_date = new Date().setDate(end_date.getDate() - Number(date)); + return $.extend(ops, {start_date: toTimestamp(new Date(start_date)), end_date: toTimestamp(new Date())}); +} + +function toTimestamp(strDate) { + var datum = Date.parse(strDate); + return datum / 1000; +} + function getPageState() { return { release: $('#release').val(), @@ -353,13 +491,14 @@ function getPageState() { module: $('#module').val(), company: $('#company').val(), user_id: $('#user').val(), - metric: $('#metric').val() + metric: $('#metric').val(), + date: $('#date').val() }; } function reload(extra) { window.location.search = $.map($.extend(getUrlVars(), extra), function (val, index) { - return val? (index + "=" + val) : null; + return val ? (index + "=" + val) : null; }).join("&") } @@ -368,44 +507,114 @@ function initSingleSelector(name, api_url, select2_extra_options, change_handler $(selectorId).val(0).select2({ data: [ - {id: 0, text: "Loading..." } + {id: 0, text: "Loading..."} ], formatSelection: function (item) { return "
" + item.text + "
" } - }).select2("enable", false); + }); - $.ajax({ - url: api_url, - dataType: "json", - success: function (data) { - var initial_value = getUrlVars()[name]; - if (initial_value) { - initial_value = (initial_value).toLocaleLowerCase(); - } else if (data["default"]) { - initial_value = data["default"]; + if (name == 'date') { + var initial_value = getUrlVars()[name]; + if (initial_value) { + initial_value = (initial_value).toLocaleLowerCase(); + } else { + initial_value = 'all'; + } + $(selectorId).val(initial_value).select2($.extend({ + data: [{"text": "All", "id": "all"}, {"text": "7 days", "id": "7"}, { + "text": "30 days", + "id": "30" + }, {"text": "60 days", "id": "60"}, {"text": "90 days", "id": "90"}, { + "text": "180 days", + "id": "180" + }] + }, select2_extra_options)).on("select2-selecting", function (e) { + var options = {}; + options[name] = e.val; + if (change_handler) { + change_handler(options); } - $(selectorId). - val(initial_value). - select2($.extend({ - data: data["data"] - }, select2_extra_options)). - on("select2-selecting",function (e) { /* don't use 'change' event, because it changes value and only after refreshes the page */ + reload(options); + }).on("select2-removed", function (e) { + console.log('select2-removed'); + var options = {}; + options[name] = ''; + reload(options); + }).select2("enable", true); + } else { + $.ajax({ + url: api_url, + dataType: "json", + success: function (data) { + var initial_value = getUrlVars()[name]; + if (initial_value) { + initial_value = (initial_value).toLocaleLowerCase(); + } else if (window.location.pathname.split('/')[1] == 'cncf') { + + switch (name) { + case "release": + initial_value = "all"; + break; + case "metric": + initial_value = "commits"; + break; + case "project_type": + initial_value = "cncf-group"; + break; + default: + initial_value = data["default"]; + break; + } + } else if (window.location.pathname.split('/')[1] == 'unaffiliated') { + switch (name) { + case "release": + initial_value = "all"; + break; + case "metric": + initial_value = "commits"; + break; + case "project_type": + initial_value = "unaffiliated"; + break; + default: + initial_value = data["default"]; + break; + } + } else if (data["default"]) { + initial_value = data["default"]; + } + + + var selectData = data["data"]; + + if (name == 'project_type') { + selectData = processProjects(data["data"]); + } + + if (name == 'release') { + var filter = "openstack"; + } + + + $(selectorId).val(initial_value).select2($.extend({ + data: selectData + }, select2_extra_options)).on("select2-selecting", function (e) { var options = {}; options[name] = e.val; if (change_handler) { change_handler(options); } reload(options); - }). - on("select2-removed",function (e) { + }).on("select2-removed", function (e) { + console.log('select2-removed'); var options = {}; options[name] = ''; reload(options); - }). - select2("enable", true); - } - }); + }).select2("enable", true); + } + }); + } } function initSelectors(base_url) { @@ -419,11 +628,40 @@ function initSelectors(base_url) { }); initSingleSelector("module", makeURI(base_url + "/api/1.0/modules", {tags: "module,program,group"}), { formatResultCssClass: function (item) { - return (item.tag)? ("select_module_" + item.tag): ""; + return (item.tag) ? ("select_module_" + item.tag) : ""; }, allowClear: true }); initSingleSelector("company", makeURI(base_url + "/api/1.0/companies"), {allowClear: true}); initSingleSelector("user_id", makeURI(base_url + "/api/1.0/users"), {allowClear: true}); initSingleSelector("metric", makeURI(base_url + "/api/1.0/metrics")); + initSingleSelector("date", "", {allowClear: false}); +} + +function processProjects(data) { + + var result = {}; + var parent = ""; + for (i = 0; i < data.length; i++) { + if (!data[i].child) { + //create new array + parent = data[i].id; + result[parent] = [data[i]] + } else { + result[parent].push(data[i]); + } + } + + var url = window.location.pathname.split('/')[1]; + + var projects = result["all"]; + + if (url == "cncf") { + projects = result["cncf-group"]; + } + if (url == "unaffiliated") { + projects = result["unaffiliated"]; + } + + return projects; } diff --git a/stackalytics/dashboard/templates/_macros/activity_log.html b/stackalytics/dashboard/templates/_macros/activity_log.html index 44e11eb0f..06314045a 100644 --- a/stackalytics/dashboard/templates/_macros/activity_log.html +++ b/stackalytics/dashboard/templates/_macros/activity_log.html @@ -2,6 +2,8 @@ show_record_type=True, show_user_gravatar=True, gravatar_size=32, show_all=True, show_twitter=False) -%} +{% set page_url = request.base_url %} + {% if show_twitter %} -

Activity Log

-
-
-
- More... +
+

Activity Log {% if company %} | {{ company_original }}{% endif %}

+ +
+
+ More... +
+ + {%- endmacro %} diff --git a/stackalytics/dashboard/templates/_macros/contribution_summary.html b/stackalytics/dashboard/templates/_macros/contribution_summary.html index 5872dba42..e3d6bf5fd 100644 --- a/stackalytics/dashboard/templates/_macros/contribution_summary.html +++ b/stackalytics/dashboard/templates/_macros/contribution_summary.html @@ -52,7 +52,9 @@ {% endraw %} -

Contribution Summary

-
+ +
+

Contribution Summary

+
{%- endmacro %} diff --git a/stackalytics/dashboard/templates/_macros/module_details.html b/stackalytics/dashboard/templates/_macros/module_details.html index 15c61e6ac..b72619b42 100644 --- a/stackalytics/dashboard/templates/_macros/module_details.html +++ b/stackalytics/dashboard/templates/_macros/module_details.html @@ -11,7 +11,7 @@ var module = data["module"]; for (var i=0; i < module.modules.length; i++) { if(!obj.hasOwnProperty(module.modules[i].module_name)){ - module.modules[i].uri = makeURI('/', {module: module.modules[i].module_name}); + module.modules[i].uri = makeURI(document.location.pathname, {module: module.modules[i].module_name}); unique_array.push(module.modules[i]); } obj[module.modules[i].module_name] = module.modules[i]; diff --git a/stackalytics/dashboard/templates/_macros/user_profile.html b/stackalytics/dashboard/templates/_macros/user_profile.html index 4fe37531d..4f1ab066e 100644 --- a/stackalytics/dashboard/templates/_macros/user_profile.html +++ b/stackalytics/dashboard/templates/_macros/user_profile.html @@ -25,7 +25,7 @@

${user_name}

-
Company: {%html company_link %} + diff --git a/stackalytics/dashboard/templates/base.html b/stackalytics/dashboard/templates/base.html index e3ba390d4..818173a37 100644 --- a/stackalytics/dashboard/templates/base.html +++ b/stackalytics/dashboard/templates/base.html @@ -2,12 +2,13 @@ - + Stackalytics {% if page_title %}| {{ page_title }} {% endif %} {% if not page_title %} - + {% else %} {% endif %} @@ -17,41 +18,61 @@ {% if page_title %} - - - - - - + + + + + + {% endif %} - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + - + - + - - - + + + @@ -61,6 +82,19 @@ + + + + + + + {% if active_tab == 'driverlog' %} {% else %} @@ -73,10 +107,8 @@ -
- - {% block body %}{% endblock %} - -
+
+ {% block body %}{% endblock %} +
\ No newline at end of file diff --git a/stackalytics/dashboard/templates/cncf.html b/stackalytics/dashboard/templates/cncf.html new file mode 100644 index 000000000..2e11f304b --- /dev/null +++ b/stackalytics/dashboard/templates/cncf.html @@ -0,0 +1,226 @@ +{% extends "cncf_layout.html" %} +{% import '_macros/activity_log.html' as activity_log %} +{% import '_macros/contribution_summary.html' as contribution_summary %} +{% import '_macros/user_profile.html' as user_profile %} +{% import '_macros/module_details.html' as module_details %} + +{% set show_company_breakdown = (not company) and (not user_id) %} +{% set show_engineer_breakdown = (not user_id) %} +{% set show_bp_breakdown = (metric in ['bpd', 'bpc']) %} +{% set show_module_breakdown = (not module) %} +{% set show_languages_breakdown = (metric in ['translations']) %} +{% set show_user_activity = (user_id) %} +{% set show_module_activity = (module) and (not user_id) %} +{% set show_activity = (show_user_activity) or (show_module_activity) %} +{% set show_contribution_on_left = (not user_id) and (module) %} +{% set show_contribution_on_right = (user_id) or (company and not module) %} +{% set show_user_profile = (user_id) %} +{% set show_module_details = (module) %} +{% set show_review_ratio = (metric in ['marks']) %} + +{% block scripts %} + + +{% endblock %} + +{% block left_frame %} + + {% if show_module_details %} + {{ module_details.show_module_details(module=module) }} + {% endif %} + + {% if show_user_profile %} + {{ user_profile.show_user_profile(user_id=user_id) }} + {% endif %} + + {% if show_company_breakdown %} + +
+ +
+
+

Commits by Company {% if user_id %} | {{ user_inst.user_name }}{% endif %}

+
+
+
+
+
+
+
+ + + + + + + + + + + +
#CompanyCommits
+
+
+
+ + {% endif %} + + {% if show_module_breakdown %} +
+ +
+
+

Commits by Project {% if company %} | {{ company_original }}{% endif %} {% if user_id %} | {{ user_inst.user_name }}{% endif %}

+
+
+
+
+
+
+
+ + + + + + + + + + + +
#ProjectCommits
+
+
+
+ {% endif %} + + {% if show_engineer_breakdown %} +
+ +

Commits by Contributor {% if company %} | {{ company_original }}{% endif %} {% if user_id %} | {{ user_inst.user_name }}{% endif %}

+ + + + + + + + + + + +
#ContributorCommits
+
+ + {% endif %} + + {% if show_contribution_on_left %} + {{ contribution_summary.show_contribution_summary(show_all=False) }} + {% endif %} + + {% if show_contribution_on_right %} + {{ contribution_summary.show_contribution_summary(show_all=False) }} + {% endif %} + + {% if show_user_activity %} + {{ activity_log.show_activity_log(gravatar_size=32, show_all=False) }} + {% endif %} + + {% if show_module_activity %} + {{ activity_log.show_activity_log(gravatar_size=32, show_all=False) }} + {% endif %} + + {% if show_contribution_on_left %} + + {% endif %} + + {% if show_contribution_on_right %} + + {% endif %} + + {% if show_bp_breakdown %} +
+

Blueprint popularity

+ +
+ This metric shows how many times a blueprint was mentioned in emails and commit messages. +
+ +
+ + + + + + + + + + + + + +
#BlueprintStatusDateMentions
+
+
+ {% endif %} + + {% if show_languages_breakdown %} +
+

Languages

+ +
+ + + + + + + + + + + +
#LanguageTranslations
+
+
+ {% endif %} + + +{% endblock %} + +{% block center_frame %} + +{% endblock %} + +{% block right_frame %} + + + + + +{% endblock %} diff --git a/stackalytics/dashboard/templates/cncf_layout.html b/stackalytics/dashboard/templates/cncf_layout.html new file mode 100644 index 000000000..cb2d227c7 --- /dev/null +++ b/stackalytics/dashboard/templates/cncf_layout.html @@ -0,0 +1,172 @@ +{% extends "base.html" %} + +{% block head %} + + + +{% block scripts %}{% endblock %} + +{% endblock %} + +{% block body %} + +
+ {% if not runtime_storage_update_time %} + + {% set update_time_title = '' %} + {% else %} + {% if runtime_storage_update_time is too_old %} + + {% endif %} + {% set update_time_title = 'Last updated on ' + runtime_storage_update_time_str %} + {% endif %} +
+
+ +
+
+
+ +
+ + +
+ +
+
+ +
+ + +
+ +
+ + +
+
+ + +
+
+ + +
+ + +
+ +
+ {% if show_module_details %} + + {% endif %} +
+
+
+ +
+
+
+ {% block left_frame %}{% endblock %} +
+
+
+ +
+
+
+ {% block right_frame %}{% endblock %} +
+
+
+ +
+
+
+ {% block center_frame %}{% endblock %} +
+
+
+
+
+
+ +
+
+
+
+{% endblock %} diff --git a/stackalytics/dashboard/templates/layout.html b/stackalytics/dashboard/templates/layout.html index a9fdd60d5..93feb0521 100644 --- a/stackalytics/dashboard/templates/layout.html +++ b/stackalytics/dashboard/templates/layout.html @@ -5,6 +5,9 @@ - {% else %} -

Languages

+

Languages

-
+
- - +
+ - - - -
# Language Translations
- {% endif %} -
-
- {% endif %} - - {% if show_module_breakdown %} -
-

Contribution by modules

- -
- - - - - - - - - - - -
#Module{{ metric_label }}
-
-
- {% endif %} - - {% if show_module_details %} - {{ module_details.show_module_details(module=module) }} - {% endif %} - - {% if show_bp_breakdown %} -
-

Blueprint popularity

- -
- This metric shows how many times a blueprint was mentioned in emails and commit messages. -
- -
- - - - - - - - - - - - - -
#BlueprintStatusDateMentions
-
+ + + + +
{% endif %} {% if show_contribution_on_right %} - {{ contribution_summary.show_contribution_summary(show_all=False) }} - {{ show_report_links(module, company, user_id) }} + {{ contribution_summary.show_contribution_summary(show_all=False) }} + {{ show_report_links(module, company, user_id) }} {% endif %} {% if show_module_activity %} - {{ activity_log.show_activity_log(gravatar_size=32, show_all=False) }} + {{ activity_log.show_activity_log(gravatar_size=32, show_all=False) }} {% endif %} +{% endblock %} + +{% block center_frame %} + +{% endblock %} + +{% block right_frame %} + + + + + {% endblock %} diff --git a/stackalytics/dashboard/templates/reports/affiliation_changes.html b/stackalytics/dashboard/templates/reports/affiliation_changes.html index 0ff23c047..66ee14f36 100644 --- a/stackalytics/dashboard/templates/reports/affiliation_changes.html +++ b/stackalytics/dashboard/templates/reports/affiliation_changes.html @@ -3,7 +3,7 @@ {% set page_title = 'Company Affiliation Changes' %} {% block scripts %} - + {% endblock %} {% block content %} -

Company Affiliation Changes

+ +
+

Company Affiliation Changes

Start of the period:   End of the period:

-
- - - - - - - - - - - -
FromToCountUsers
-
+ + + + + + + + + + + +
FromToCountUsers
+
{% endblock %} diff --git a/stackalytics/dashboard/templates/reports/base_report.html b/stackalytics/dashboard/templates/reports/base_report.html index 0518f2761..f9370e777 100644 --- a/stackalytics/dashboard/templates/reports/base_report.html +++ b/stackalytics/dashboard/templates/reports/base_report.html @@ -7,9 +7,9 @@ {% block body %}
-
+
- | community heartbeat + | community heartbeat
{% block content %} diff --git a/stackalytics/dashboard/templates/reports/driverlog.html b/stackalytics/dashboard/templates/reports/driverlog.html index b81ed51ea..a2c136d7a 100644 --- a/stackalytics/dashboard/templates/reports/driverlog.html +++ b/stackalytics/dashboard/templates/reports/driverlog.html @@ -20,40 +20,52 @@
-
- -
-
- +
+
+
+
+
+
- +
+
+
+ + +
+
+ + +
+
+ + +
-
+
-
- -
- -
- - -
- -
- - -
-
@@ -145,5 +157,6 @@
+
{% endblock %} diff --git a/stackalytics/dashboard/templates/reports/members.html b/stackalytics/dashboard/templates/reports/members.html index 88dd8bf69..634a792f7 100644 --- a/stackalytics/dashboard/templates/reports/members.html +++ b/stackalytics/dashboard/templates/reports/members.html @@ -4,7 +4,7 @@ {% set page_title = 'OpenStack Foundation members' %} {% block head %} - + - + table.dataTable tr.even td.sorting_1 { + background-color: #E0E8E8; + } + - + $(document).on('change', '#company_selector', function (evt) { + reload(); + }); + {% endblock %} {% block body %}
-
-
- About -
+
-
- -
-
- +
+
+ + + + +
+
+
+ + +
+
+ + +
+ +
+ +
+ + + +
- +
+
+
+

OpenStack foundation member companies

-
-
- - -
- -
- - -
-
- - - - - - - -
-

OpenStack foundation member companies

- -
@@ -342,26 +363,20 @@
-
-

Members by company

-
-
- -
-
+
+
+
+

Members by company

+
-
+
+
- - - - - -
-

Individual Members

- -
+
+
+
+

Individual Members

@@ -375,14 +390,10 @@
-
-
+
+
+

New Companies

-
- -
- @@ -395,11 +406,9 @@
-
- -
+
+
+
{% endblock %} diff --git a/stackalytics/dashboard/templates/unaffiliated.html b/stackalytics/dashboard/templates/unaffiliated.html new file mode 100644 index 000000000..5c4182e39 --- /dev/null +++ b/stackalytics/dashboard/templates/unaffiliated.html @@ -0,0 +1,218 @@ +{% extends "unaffiliated_layout.html" %} +{% import '_macros/activity_log.html' as activity_log %} +{% import '_macros/contribution_summary.html' as contribution_summary %} +{% import '_macros/user_profile.html' as user_profile %} +{% import '_macros/module_details.html' as module_details %} + +{% set show_company_breakdown = (not company) and (not user_id) %} +{% set show_engineer_breakdown = (not user_id) %} +{% set show_bp_breakdown = (metric in ['bpd', 'bpc']) %} +{% set show_module_breakdown = (not module) %} +{% set show_languages_breakdown = (metric in ['translations']) %} +{% set show_user_activity = (user_id) %} +{% set show_module_activity = (module) and (not user_id) %} +{% set show_activity = (show_user_activity) or (show_module_activity) %} +{% set show_contribution_on_left = (not user_id) and (module) %} +{% set show_contribution_on_right = (user_id) or (company and not module) %} +{% set show_user_profile = (user_id) %} +{% set show_module_details = (module) %} +{% set show_review_ratio = (metric in ['marks']) %} + +{% block scripts %} + + +{% endblock %} + +{% block left_frame %} + + {% if show_module_details %} + {{ module_details.show_module_details(module=module) }} + {% endif %} + + {% if show_company_breakdown %} + +
+ +
+
+

Commits by Company

+
+
+
+ +
+
+
+
+ + + + + + + + + + + +
#CompanyCommits
+
+
+
+ + {% endif %} + + {% if show_module_breakdown %} +
+ +
+
+

Commits by Module

+
+
+
+ +
+
+
+
+ + + + + + + + + + + +
#ModuleCommits
+
+
+
+ {% endif %} + + {% if show_engineer_breakdown %} +
+ +

Commits by Contributor

+ + + + + + + + + + + +
#ContributorCommits
+
+ + {% endif %} + + {% if show_user_profile %} + {{ user_profile.show_user_profile(user_id=user_id) }} + {% endif %} + {% if show_user_activity %} + {{ activity_log.show_activity_log(gravatar_size=32, show_all=False) }} + {% endif %} + + {% if show_contribution_on_left %} + {{ contribution_summary.show_contribution_summary(show_all=False) }} + {% endif %} + + {% if show_bp_breakdown %} +
+

Blueprint popularity

+ +
+ This metric shows how many times a blueprint was mentioned in emails and commit messages. +
+ +
+ + + + + + + + + + + + + +
#BlueprintStatusDateMentions
+
+
+ {% endif %} + + {% if show_languages_breakdown %} +
+

Languages

+ +
+ + + + + + + + + + + +
#LanguageTranslations
+
+
+ {% endif %} + + {% if show_contribution_on_right %} + {{ contribution_summary.show_contribution_summary(show_all=False) }} + {% endif %} + + {% if show_module_activity %} + {{ activity_log.show_activity_log(gravatar_size=32, show_all=False) }} + {% endif %} + +{% endblock %} + +{% block center_frame %} + +{% endblock %} + +{% block right_frame %} + + + + + +{% endblock %} diff --git a/stackalytics/dashboard/templates/unaffiliated_layout.html b/stackalytics/dashboard/templates/unaffiliated_layout.html new file mode 100644 index 000000000..4c374328d --- /dev/null +++ b/stackalytics/dashboard/templates/unaffiliated_layout.html @@ -0,0 +1,173 @@ +{% extends "base.html" %} + +{% block head %} + + + +{% block scripts %}{% endblock %} + +{% endblock %} + +{% block body %} + +
+ {% if not runtime_storage_update_time %} + + {% set update_time_title = '' %} + {% else %} + {% if runtime_storage_update_time is too_old %} + + {% endif %} + {% set update_time_title = 'Last updated on ' + runtime_storage_update_time_str %} + {% endif %} +
+
+ +
+
+
+ +
+ + +
+ +
+
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + +
+ +
+ {% if show_module_details %} + + {% endif %} +
+
+
+ +
+
+
+ {% block left_frame %}{% endblock %} +
+
+
+ +
+
+
+ {% block right_frame %}{% endblock %} +
+
+
+ +
+
+
+ {% block center_frame %}{% endblock %} +
+
+
+ +
+
+
+ +
+
+
+
+{% endblock %} diff --git a/stackalytics/dashboard/web.py b/stackalytics/dashboard/web.py index a72ae6ba1..31431f168 100644 --- a/stackalytics/dashboard/web.py +++ b/stackalytics/dashboard/web.py @@ -55,6 +55,18 @@ def overview(): pass +@app.route('/cncf') +@decorators.templated() +def cncf(): + pass + + +@app.route('/unaffiliated') +@decorators.templated() +def unaffiliated(): + pass + + @app.route('/widget') def widget(): return flask.render_template('widget.html') @@ -504,7 +516,8 @@ def get_user(user_id): @decorators.jsonify(root=('data', 'default')) def get_releases_json(**kwargs): releases = [{'id': release['release_name'], - 'text': release['release_name'].capitalize()} + 'text': release['release_name'].capitalize(), + 'project': release.get('project')} for release in vault.get_vault()['releases'].values()] releases.append({'id': 'all', 'text': 'All'}) releases.reverse() diff --git a/stackalytics/processor/config.py b/stackalytics/processor/config.py index eb796ac16..f731ad77a 100644 --- a/stackalytics/processor/config.py +++ b/stackalytics/processor/config.py @@ -25,8 +25,8 @@ CONNECTION_OPTS = [ PROCESSOR_OPTS = [ cfg.StrOpt('default-data-uri', - default='https://git.openstack.org/cgit/' - 'openstack/stackalytics/plain/etc/default_data.json', + default='https://raw.githubusercontent.com/stackalytics/' + 'default_data/master/default_data.json', help='URI for default data. A local file can be used with the ' 'prefix "file://". For example, ' 'default_data_uri = file:///path/to/default_data.json'), diff --git a/stackalytics/processor/schema.py b/stackalytics/processor/schema.py index 51f1f0f7c..70f07600d 100644 --- a/stackalytics/processor/schema.py +++ b/stackalytics/processor/schema.py @@ -76,6 +76,9 @@ default_data = { "release_name": { "type": "string" }, + "project": { + "type": "string" + }, "end_date": { "$ref": "#/definitions/date_format" }, diff --git a/stackalytics/processor/vcs.py b/stackalytics/processor/vcs.py index bb98daf95..4832959f5 100644 --- a/stackalytics/processor/vcs.py +++ b/stackalytics/processor/vcs.py @@ -181,6 +181,7 @@ class Git(Vcs): LOG.debug('Parsing git log for repo uri %s', self.repo['uri']) os.chdir(self.folder) + if not self._checkout(branch): return @@ -281,6 +282,9 @@ class Git(Vcs): def get_last_id(self, branch): LOG.debug('Get head commit for repo uri: %s', self.repo['uri']) + if not os.path.exists(self.folder): + return None + os.chdir(self.folder) if not self._checkout(branch): return None diff --git a/stackalytics/tests/api/test_releases.py b/stackalytics/tests/api/test_releases.py index 72374411f..b1de4a0f4 100644 --- a/stackalytics/tests/api/test_releases.py +++ b/stackalytics/tests/api/test_releases.py @@ -21,9 +21,12 @@ class TestAPIReleases(test_api.TestAPI): def test_releases(self): with test_api.make_runtime_storage( {'releases': [ - {'release_name': 'prehistory', 'end_date': 1365033600}, - {'release_name': 'havana', 'end_date': 1381968000}, - {'release_name': 'icehouse', 'end_date': 1397692800}], + {'release_name': 'prehistory', 'end_date': 1365033600, + 'project': 'nova'}, + {'release_name': 'havana', 'end_date': 1381968000, + 'project': 'glance'}, + {'release_name': 'icehouse', 'end_date': 1397692800, + 'project': 'nova-cli'}], 'project_types': [ {'id': 'all', 'title': 'All', 'modules': ['nova', 'glance', 'nova-cli']}, @@ -32,6 +35,9 @@ class TestAPIReleases(test_api.TestAPI): test_api.make_records(record_type=['commit'])): response = self.app.get('/api/1.0/releases') releases = test_api.load_json(response)['data'] + print(str(releases)) self.assertEqual(3, len(releases)) self.assertIn({'id': 'all', 'text': 'All'}, releases) - self.assertIn({'id': 'icehouse', 'text': 'Icehouse'}, releases) + self.assertIn( + {'project': 'nova-cli', 'id': 'icehouse', + 'text': 'Icehouse'}, releases) diff --git a/stackalytics/tests/unit/test_config_files.py b/stackalytics/tests/unit/test_config_files.py index d1331f17c..f2470dd4b 100644 --- a/stackalytics/tests/unit/test_config_files.py +++ b/stackalytics/tests/unit/test_config_files.py @@ -125,7 +125,8 @@ class TestConfigFiles(testtools.TestCase): def _verify_users_in_alphabetical_order(self, file_name): users = self._read_file(file_name)['users'] self._verify_ordering( - users, key=lambda x: (x.get('launchpad_id') or x.get('github_id')), + users, + key=lambda x: (x.get('launchpad_id') or x.get('github_id') or ''), msg='List of users should be ordered by launchpad id or ldap id ' 'or github id') diff --git a/stackalytics/tests/unit/test_helpers.py b/stackalytics/tests/unit/test_helpers.py index 6ac6daa10..02e2fc8d0 100644 --- a/stackalytics/tests/unit/test_helpers.py +++ b/stackalytics/tests/unit/test_helpers.py @@ -68,7 +68,7 @@ class TestHelpers(testtools.TestCase): observed = helpers.extend_user(user) self.assertEqual(expected, observed) - mock_make_link.assert_called_once_with('TheCompany', '/', mock.ANY) + mock_make_link.assert_called_once_with('TheCompany', '', mock.ANY) @mock.patch('time.time') @mock.patch('stackalytics.dashboard.helpers.make_link') @@ -92,4 +92,4 @@ class TestHelpers(testtools.TestCase): helpers.extend_user(user) - mock_make_link.assert_called_once_with('Current', '/', mock.ANY) + mock_make_link.assert_called_once_with('Current', '', mock.ANY)