def setUp(self): self.feature_1 = models.Feature( name='feature one', summary='sum', category=1, visibility=1, standardization=1, web_dev_views=1, impl_status_chrome=1) self.feature_1.put() self.feature_2 = models.Feature( name='feature two', summary='sum', category=1, visibility=1, standardization=1, web_dev_views=1, impl_status_chrome=1) self.feature_2.put()
def post(self, path): user = users.get_current_user() if user is None or (user and not self.user_can_edit(user)): common.handle_401(self.request, self.response, Exception) return owner_addrs = self.split_input('owner', delim=',') owners = [db.Email(addr) for addr in owner_addrs] blink_components = ( self.split_input('blink_components', delim=',') or [models.BlinkComponent.DEFAULT_COMPONENT]) # TODO(jrobbins): Validate input, even though it is done on client. feature = models.Feature( category=int(self.request.get('category')), name=self.request.get('name'), feature_type=int(self.request.get('feature_type', 0)), intent_stage=models.INTENT_NONE, summary=self.request.get('summary'), owner=owners, impl_status_chrome=models.NO_ACTIVE_DEV, standardization=models.EDITORS_DRAFT, unlisted=self.request.get('unlisted') == 'on', web_dev_views=models.DEV_NO_SIGNALS, blink_components=blink_components) key = feature.put() # TODO(jrobbins): enumerate and remove only the relevant keys. memcache.flush_all() redirect_url = '/guide/edit/' + str(key.id()) return self.redirect(redirect_url)
def setUp(self): self.feature_1 = models.Feature( name='feature one', summary='sum', category=1, visibility=1, standardization=1, web_dev_views=1, impl_status_chrome=1) self.feature_1.put() self.handler = notifier.GetUserStarsHandler() self.handler.request = webapp2.Request.blank('/features/star/list') self.handler.response = webapp2.Response()
def setUp(self): self.feature_1 = models.Feature( name='feature one', summary='sum', category=1, visibility=1, standardization=1, web_dev_views=1, impl_status_chrome=1) self.feature_1.put() request = webapp2.Request.blank( '/guide/edit/%d' % self.feature_1.key().id()) response = webapp2.Response() self.handler = guide.ProcessOverview(request, response)
def setUp(self): self.feature_1 = models.Feature( name='feature one', summary='sum', category=1, visibility=1, standardization=1, web_dev_views=1, impl_status_chrome=1) self.feature_1.put() self.stage = models.INTENT_INCUBATE # Shows first form request = webapp2.Request.blank( '/guide/stage/%d/%d' % (self.feature_1.key().id(), self.stage)) response = webapp2.Response() self.handler = guide.FeatureEditStage(request, response)
def setUp(self): self.feature_1 = models.Feature( name='feature one', summary='sum', category=1, visibility=1, standardization=1, web_dev_views=1, impl_status_chrome=1, created_by=users.User('*****@*****.**'), updated_by=users.User('*****@*****.**'), blink_components=['Blink']) self.feature_1.put() self.component_1 = models.BlinkComponent(name='Blink') self.component_1.put() self.owner_1 = models.FeatureOwner( name='owner_1', email='*****@*****.**', primary_blink_components=[self.component_1.key()]) self.owner_1.put() self.watcher_1 = models.FeatureOwner(name='watcher_1', email='*****@*****.**', watching_all_features=True) self.watcher_1.put() self.changes = [ dict(prop_name='test_prop', new_val='test new value', old_val='test old value') ] self.feature_2 = models.Feature( name='feature two', summary='sum', category=1, visibility=1, standardization=1, web_dev_views=1, impl_status_chrome=1, created_by=users.User('*****@*****.**'), updated_by=users.User('*****@*****.**'), blink_components=['Blink']) self.feature_2.put()
def setUp(self): self.feature_1 = models.Feature( name='feature one', summary='sum', category=1, visibility=1, standardization=1, web_dev_views=1, impl_status_chrome=1, created_by=users.User('*****@*****.**'), updated_by=users.User('*****@*****.**')) self.feature_1.put() self.component_1 = models.BlinkComponent(name='Blink') self.component_1.put() self.owner_1 = models.FeatureOwner( name='owner_1', email='*****@*****.**', primary_blink_components=[self.component_1.key()]) self.owner_1.put() self.watcher_1 = models.FeatureOwner( name='watcher_1', email='*****@*****.**', watching_all_features=True) self.watcher_1.put()
def post(self, path, feature_id=None): user = users.get_current_user() if user is None or (user and not self.user_can_edit(user)): common.handle_401(self.request, self.response, Exception) return spec_link = self.__FullQualifyLink('spec_link') explainer_links = self.request.get('explainer_links') or [] if explainer_links: explainer_links = filter(bool, [x.strip() for x in re.split('\\r?\\n', explainer_links)]) bug_url = self.__FullQualifyLink('bug_url') launch_bug_url = self.__FullQualifyLink('launch_bug_url') initial_public_proposal_url = self.__FullQualifyLink( 'initial_public_proposal_url') intent_to_implement_url = self.__FullQualifyLink('intent_to_implement_url') origin_trial_feedback_url = self.__FullQualifyLink('origin_trial_feedback_url') ff_views_link = self.__FullQualifyLink('ff_views_link') ie_views_link = self.__FullQualifyLink('ie_views_link') safari_views_link = self.__FullQualifyLink('safari_views_link') web_dev_views_link = self.__FullQualifyLink('web_dev_views_link') # Cast incoming milestones to ints. shipped_milestone = self.__ToInt('shipped_milestone') shipped_android_milestone = self.__ToInt('shipped_android_milestone') shipped_ios_milestone = self.__ToInt('shipped_ios_milestone') shipped_webview_milestone = self.__ToInt('shipped_webview_milestone') shipped_opera_milestone = self.__ToInt('shipped_opera_milestone') shipped_opera_android_milestone = self.__ToInt('shipped_opera_android_milestone') owners = self.request.get('owner') or [] if owners: owners = [db.Email(x.strip()) for x in owners.split(',')] doc_links = self.request.get('doc_links') or [] if doc_links: doc_links = filter(bool, [x.strip() for x in re.split('\\r?\\n', doc_links)]) sample_links = self.request.get('sample_links') or [] if sample_links: sample_links = filter(bool, [x.strip() for x in re.split('\\r?\\n', sample_links)]) search_tags = self.request.get('search_tags') or [] if search_tags: search_tags = filter(bool, [x.strip() for x in search_tags.split(',')]) blink_components = self.request.get('blink_components') or models.BlinkComponent.DEFAULT_COMPONENT if blink_components: blink_components = filter(bool, [x.strip() for x in blink_components.split(',')]) devrel = self.request.get('devrel') or [] if devrel: devrel = [db.Email(x.strip()) for x in devrel.split(',')] try: intent_stage = int(self.request.get('intent_stage')) except: logging.error('Invalid intent_stage \'{}\'' \ .format(self.request.get('intent_stage'))) # Default the intent stage to 1 (Prototype) if we failed to get a valid # intent stage from the request. This should be removed once we # understand what causes this. intent_stage = 1 if feature_id: # /admin/edit/1234 feature = models.Feature.get_by_id(long(feature_id)) if feature is None: return self.redirect(self.request.path) if 'delete' in path: feature.delete() memcache.flush_all() return # Bomb out early for AJAX delete. No need to redirect. # Update properties of existing feature. feature.category = int(self.request.get('category')) feature.name = self.request.get('name') feature.intent_stage = intent_stage feature.summary = self.request.get('summary') feature.unlisted = self.request.get('unlisted') == 'on' feature.intent_to_implement_url = intent_to_implement_url feature.origin_trial_feedback_url = origin_trial_feedback_url feature.motivation = self.request.get('motivation') feature.explainer_links = explainer_links feature.owner = owners feature.bug_url = bug_url feature.launch_bug_url = launch_bug_url feature.initial_public_proposal_url = initial_public_proposal_url feature.blink_components = blink_components feature.devrel = devrel feature.impl_status_chrome = int(self.request.get('impl_status_chrome')) feature.shipped_milestone = shipped_milestone feature.shipped_android_milestone = shipped_android_milestone feature.shipped_ios_milestone = shipped_ios_milestone feature.shipped_webview_milestone = shipped_webview_milestone feature.shipped_opera_milestone = shipped_opera_milestone feature.shipped_opera_android_milestone = shipped_opera_android_milestone feature.footprint = int(self.request.get('footprint')) feature.interop_compat_risks = self.request.get('interop_compat_risks') feature.ergonomics_risks = self.request.get('ergonomics_risks') feature.activation_risks = self.request.get('activation_risks') feature.security_risks = self.request.get('security_risks') feature.debuggability = self.request.get('debuggability') feature.all_platforms = self.request.get('all_platforms') == 'on' feature.all_platforms_descr = self.request.get('all_platforms_descr') feature.wpt = self.request.get('wpt') == 'on' feature.wpt_descr = self.request.get('wpt_descr') feature.ff_views = int(self.request.get('ff_views')) feature.ff_views_link = ff_views_link feature.ff_views_notes = self.request.get('ff_views_notes') feature.ie_views = int(self.request.get('ie_views')) feature.ie_views_link = ie_views_link feature.ie_views_notes = self.request.get('ie_views_notes') feature.safari_views = int(self.request.get('safari_views')) feature.safari_views_link = safari_views_link feature.safari_views_notes = self.request.get('safari_views_notes') feature.web_dev_views = int(self.request.get('web_dev_views')) feature.web_dev_views_link = web_dev_views_link feature.web_dev_views_notes = self.request.get('web_dev_views_notes') feature.prefixed = self.request.get('prefixed') == 'on' feature.spec_link = spec_link feature.tag_review = self.request.get('tag_review') feature.standardization = int(self.request.get('standardization')) feature.doc_links = doc_links feature.sample_links = sample_links feature.search_tags = search_tags feature.comments = self.request.get('comments') feature.experiment_goals = self.request.get('experiment_goals') feature.experiment_timeline = self.request.get('experiment_timeline') feature.experiment_risks = self.request.get('experiment_risks') feature.experiment_extension_reason = self.request.get('experiment_extension_reason') feature.ongoing_constraints = self.request.get('ongoing_constraints') else: # Check bug for existing blink component(s) used to label the bug. If # found, use the first component name instead of the generic "Blink" name. try: blink_components = self.__get_blink_component_from_bug(blink_components, bug_url) except Exception: pass feature = models.Feature( category=int(self.request.get('category')), name=self.request.get('name'), intent_stage=intent_stage, summary=self.request.get('summary'), intent_to_implement_url=intent_to_implement_url, origin_trial_feedback_url=origin_trial_feedback_url, motivation=self.request.get('motivation'), explainer_links=explainer_links, owner=owners, bug_url=bug_url, launch_bug_url=launch_bug_url, initial_public_proposal_url=initial_public_proposal_url, blink_components=blink_components, devrel=devrel, impl_status_chrome=int(self.request.get('impl_status_chrome')), shipped_milestone=shipped_milestone, shipped_android_milestone=shipped_android_milestone, shipped_ios_milestone=shipped_ios_milestone, shipped_webview_milestone=shipped_webview_milestone, shipped_opera_milestone=shipped_opera_milestone, shipped_opera_android_milestone=shipped_opera_android_milestone, interop_compat_risks=self.request.get('interop_compat_risks'), ergonomics_risks=self.request.get('ergonomics_risks'), activation_risks=self.request.get('activation_risks'), security_risks=self.request.get('security_risks'), debuggability=self.request.get('debuggability'), all_platforms=self.request.get('all_platforms') == 'on', all_platforms_descr=self.request.get('all_platforms_descr'), wpt=self.request.get('wpt') == 'on', wpt_descr=self.request.get('wpt_descr'), footprint=int(self.request.get('footprint')), ff_views=int(self.request.get('ff_views')), ff_views_link=ff_views_link, ff_views_notes=self.request.get('ff_views_notes'), ie_views=int(self.request.get('ie_views')), ie_views_link=ie_views_link, ie_views_notes=self.request.get('ie_views_notes'), safari_views=int(self.request.get('safari_views')), safari_views_link=safari_views_link, safari_views_notes=self.request.get('safari_views_notes'), web_dev_views=int(self.request.get('web_dev_views')), web_dev_views_link=web_dev_views_link, web_dev_views_notes=self.request.get('web_dev_views_notes'), prefixed=self.request.get('prefixed') == 'on', spec_link=spec_link, tag_review=self.request.get('tag_review'), standardization=int(self.request.get('standardization')), doc_links=doc_links, sample_links=sample_links, search_tags=search_tags, comments=self.request.get('comments'), experiment_goals=self.request.get('experiment_goals'), experiment_timeline=self.request.get('experiment_timeline'), experiment_risks=self.request.get('experiment_risks'), experiment_extension_reason=self.request.get('experiment_extension_reason'), ongoing_constraints=self.request.get('ongoing_constraints'), ) params = [] if self.request.get('create_launch_bug') == 'on': params.append(self.LAUNCH_PARAM) if self.request.get('intent_to_implement') == 'on': params.append(self.INTENT_PARAM) feature.intent_template_use_count += 1 key = feature.put() # TODO(ericbidelman): enumerate and remove only the relevant keys. memcache.flush_all() redirect_url = '/feature/' + str(key.id()) if len(params): redirect_url = '%s/%s?%s' % (self.LAUNCH_URL, key.id(), '&'.join(params)) return self.redirect(redirect_url)
def post(self, path, feature_id=None): spec_link = self.__FullQualifyLink('spec_link') bug_url = self.__FullQualifyLink('bug_url') ff_views_link = self.__FullQualifyLink('ff_views_link') ie_views_link = self.__FullQualifyLink('ie_views_link') safari_views_link = self.__FullQualifyLink('safari_views_link') # Cast incoming milestones to ints. shipped_milestone = self.__ToInt('shipped_milestone') shipped_android_milestone = self.__ToInt('shipped_android_milestone') shipped_ios_milestone = self.__ToInt('shipped_ios_milestone') shipped_webview_milestone = self.__ToInt('shipped_webview_milestone') shipped_opera_milestone = self.__ToInt('shipped_opera_milestone') shipped_opera_android_milestone = self.__ToInt( 'shipped_opera_android_milestone') owners = self.request.get('owner') or [] if owners: owners = [db.Email(x.strip()) for x in owners.split(',')] doc_links = self.request.get('doc_links') or [] if doc_links: doc_links = [x.strip() for x in re.split('\\r?\\n', doc_links)] sample_links = self.request.get('sample_links') or [] if sample_links: sample_links = [ x.strip() for x in re.split('\\r?\\n', sample_links) ] search_tags = self.request.get('search_tags') or [] if search_tags: search_tags = [x.strip() for x in search_tags.split(',')] # Update/delete existing feature. if feature_id: # /admin/edit/1234 feature = models.Feature.get_by_id(long(feature_id)) if feature is None: return self.redirect(self.request.path) if 'delete' in path: feature.delete() memcache.flush_all() return # Bomb out early for AJAX delete. No need to redirect. # Update properties of existing feature. feature.category = int(self.request.get('category')) feature.name = self.request.get('name') feature.summary = self.request.get('summary') feature.owner = owners feature.bug_url = bug_url feature.bug_component = self.request.get('bug_component') feature.impl_status_chrome = int( self.request.get('impl_status_chrome')) feature.shipped_milestone = shipped_milestone feature.shipped_android_milestone = shipped_android_milestone feature.shipped_ios_milestone = shipped_ios_milestone feature.shipped_webview_milestone = shipped_webview_milestone feature.shipped_opera_milestone = shipped_opera_milestone feature.shipped_opera_android_milestone = shipped_opera_android_milestone feature.footprint = int(self.request.get('footprint')) feature.visibility = int(self.request.get('visibility')) feature.ff_views = int(self.request.get('ff_views')) feature.ff_views_link = ff_views_link feature.ie_views = int(self.request.get('ie_views')) feature.ie_views_link = ie_views_link feature.safari_views = int(self.request.get('safari_views')) feature.safari_views_link = safari_views_link feature.prefixed = self.request.get('prefixed') == 'on' feature.spec_link = spec_link feature.standardization = int(self.request.get('standardization')) feature.comments = self.request.get('comments') feature.web_dev_views = int(self.request.get('web_dev_views')) feature.doc_links = doc_links feature.sample_links = sample_links feature.search_tags = search_tags else: feature = models.Feature( category=int(self.request.get('category')), name=self.request.get('name'), summary=self.request.get('summary'), owner=owners, bug_url=bug_url, bug_component=self.request.get('bug_component'), impl_status_chrome=int(self.request.get('impl_status_chrome')), shipped_milestone=shipped_milestone, shipped_android_milestone=shipped_android_milestone, shipped_ios_milestone=shipped_ios_milestone, shipped_webview_milestone=shipped_webview_milestone, shipped_opera_milestone=shipped_opera_milestone, shipped_opera_android_milestone=shipped_opera_android_milestone, footprint=int(self.request.get('footprint')), visibility=int(self.request.get('visibility')), ff_views=int(self.request.get('ff_views')), ff_views_link=ff_views_link, ie_views=int(self.request.get('ie_views')), ie_views_link=ie_views_link, safari_views=int(self.request.get('safari_views')), safari_views_link=safari_views_link, prefixed=self.request.get('prefixed') == 'on', spec_link=spec_link, standardization=int(self.request.get('standardization')), comments=self.request.get('comments'), web_dev_views=int(self.request.get('web_dev_views')), doc_links=doc_links, sample_links=sample_links, search_tags=search_tags, ) key = feature.put() # TODO(ericbidelman): enumerate and remove only the relevant keys. memcache.flush_all() params = [] if self.request.get('create_launch_bug') == 'on': params.append(self.LAUNCH_PARAM) if self.request.get('intent_to_implement') == 'on': params.append(self.INTENT_PARAM) redirect_url = '/feature/' + str(key.id()) if len(params): redirect_url = '%s/%s?%s' % (self.LAUNCH_URL, key.id(), '&'.join(params)) return self.redirect(redirect_url)
def scrape_site(self, nzaa_id): """All the functions to update a site record. Login to ArchSite (if necessary). Go to the record, get the source, process this into an extract, then process this into the site record structures. Extract values for actor, feature and period. If no record for each value is found, create one and add this site to it's relations table. Compute an MD5 checksum for the values and compare this with the stored version. Check for the existence of a site record, and an update0 record. Save the records into the db apopropriately. """ message = "Scraping site " + nzaa_id if self.VERBOSE: print message s = None u = None update_id = nzaa_id + '-0' html = None extract = None now = datetime.datetime.now(pytz.timezone('NZ')) unchanged = False if self.login(): html = self.visit_site(nzaa_id) if html: extract = self.extract_values(html) if not extract: message = "No site record found for " + nzaa_id if self.VERBOSE: print message return None self.extract = extract # Create MD5 checksum of extracted values, replacing unknown # unicode characters. hash = hashlib.md5() checksum = '' for k in sorted(extract.keys()): try: hash.update( unicode(extract[k]).replace(u'\u0101', 'ā').replace( u'\u012b', 'ī').replace(u'\u016b', 'ū'). replace(u'\u02bc', 'ʼ').replace( u'\u02c6', 'ˆ').replace(u'\u02da', '˚ '). replace(u'\u2013', '–').replace( u'\u2014', '—').replace(u'\u2018', '‘'). replace(u'\u2019', '’').replace( u'\u201c', '“').replace(u'\u201d', '”'). replace(u'\u2022', '•').replace( u'\u2026', '…').replace(u'\u20a4', '₤'). replace(u'\u2154', '⅔').replace(u'\uf644', ''). replace(u'\uf64b', '').replace(u'\uf64c', '').replace( u'\xa0', ' ').replace(u'\xa3', '£').replace( u'\xa9', '©').replace(u'\xac', '¬'). replace(u'\xad', '­').replace(u'\xb0', '°'). replace(u'\xb1', '±').replace( u'\xb2', '²').replace(u'\xb3', '³').replace( u'\xb4', '´').replace(u'\xb7', '·'). replace(u'\xba', 'º').replace(u'\xbc', '¼'). replace(u'\xbd', '½').replace(u'\xbe', '¾'). replace(u'\xe6', 'æ').replace(u'\xe7', 'ç'). replace(u'\xe8', 'è').replace(u'\xe9', 'é') + "\n") except UnicodeEncodeError as e: line = nzaa_id + " " + str(e) + "\n" dumpfile = "/home/malcolm/tmp/scrape_dumps.txt" f = open(dumpfile, "a") f.write(line) f.close digest = hash.hexdigest() # Build the structures necessary to affect database tables. (new_site, site, update0) = self.process_extract(extract) # Try finding a site record. try: s = models.Site.objects.get(nzaa_id=nzaa_id) if digest == s.digest: unchanged = True s.extracted = now message = ("Record unchanged since " + unicode(s.last_change.replace(microsecond=0))) log = ( '127.0.0.1', 'scrape', message, ) if self.VERBOSE: print message else: message = "Updating existing site record for " + nzaa_id s.digest = digest s.last_change = now self.logging(message) if self.VERBOSE: print message log = ('127.0.0.1', 'scrape', "Updating record from from ArchSite.") s.__dict__.update(**site) except models.Site.DoesNotExist: message = "Creating site record for " + nzaa_id self.logging(message) if self.VERBOSE: print message data = new_site.copy() data.update(new_site) s = models.Site(**data) s.created = datetime.datetime.now(pytz.utc) s.created_by = 'scrape' s.digest = digest s.last_change = now log = ( '127.0.0.1', 'scrape', "Creating record from from ArchSite.", ) point = Point(s.easting, s.northing, 2913) if not s.region: s.region = s.get_region() if not s.tla: s.tla = s.get_tla() if not s.island: s.island = s.get_island() if self.VERBOSE: print "Saving site record", s s.save(log=log) # If there are no changes, then we have done all we have to do. if unchanged: return None # Deal with actors. sourcenames = s.list_actors() for sourcename in sourcenames: try: a = models.Actor.objects.get(sourcename=sourcename) except: a = models.Actor(sourcename=sourcename) a.save() a.sites.add(s) # Deal with features. features = s.list_features() if features: for feature in features: try: f = models.Feature.objects.get(name=feature) except: f = models.Feature(name=feature) f.save() f.sites.add(s) # Deal with period. periods = s.list_periods() for period in periods: try: p = models.Periods.objects.get(name=period) except models.Periods.DoesNotExist: p = models.Periods(name=period) p.save() p.sites.add(s) update0['site'] = s update0['update_id'] = update_id try: u = models.Update.objects.get(update_id=update_id) u.nzaa_id = s message = "Updating existing record for " + update_id self.logging(message) if self.VERBOSE: print message u.__dict__.update(**update0) except models.Update.DoesNotExist: message = "Creating update record for " + update_id self.logging(message) if self.VERBOSE: print message u = models.Update(**update0) u.nzaa_id_id = s u.created = datetime.datetime.now(pytz.utc) u.created_by = 'scrape' u.save(log=log)
def post(self, path, feature_id=None): user = users.get_current_user() if user is None or (user and not self._is_user_whitelisted(user)): common.handle_401(self.request, self.response, Exception) return spec_link = self.__FullQualifyLink('spec_link') bug_url = self.__FullQualifyLink('bug_url') ff_views_link = self.__FullQualifyLink('ff_views_link') ie_views_link = self.__FullQualifyLink('ie_views_link') safari_views_link = self.__FullQualifyLink('safari_views_link') # Cast incoming milestones to ints. shipped_milestone = self.__ToInt('shipped_milestone') shipped_android_milestone = self.__ToInt('shipped_android_milestone') shipped_ios_milestone = self.__ToInt('shipped_ios_milestone') shipped_webview_milestone = self.__ToInt('shipped_webview_milestone') shipped_opera_milestone = self.__ToInt('shipped_opera_milestone') shipped_opera_android_milestone = self.__ToInt('shipped_opera_android_milestone') owners = self.request.get('owner') or [] if owners: owners = [db.Email(x.strip()) for x in owners.split(',')] doc_links = self.request.get('doc_links') or [] if doc_links: doc_links = filter(bool, [x.strip() for x in re.split('\\r?\\n', doc_links)]) sample_links = self.request.get('sample_links') or [] if sample_links: sample_links = filter(bool, [x.strip() for x in re.split('\\r?\\n', sample_links)]) search_tags = self.request.get('search_tags') or [] if search_tags: search_tags = filter(bool, [x.strip() for x in search_tags.split(',')]) blink_components = self.request.get('blink_components') or models.BlinkComponent.DEFAULT_COMPONENT if blink_components: blink_components = filter(bool, [x.strip() for x in blink_components.split(',')]) if feature_id: # /admin/edit/1234 feature = models.Feature.get_by_id(long(feature_id)) if feature is None: return self.redirect(self.request.path) if 'delete' in path: feature.delete() memcache.flush_all() return # Bomb out early for AJAX delete. No need to redirect. # Update properties of existing feature. feature.category = int(self.request.get('category')) feature.name = self.request.get('name') feature.summary = self.request.get('summary') feature.owner = owners feature.bug_url = bug_url feature.blink_components = blink_components feature.impl_status_chrome = int(self.request.get('impl_status_chrome')) feature.shipped_milestone = shipped_milestone feature.shipped_android_milestone = shipped_android_milestone feature.shipped_ios_milestone = shipped_ios_milestone feature.shipped_webview_milestone = shipped_webview_milestone feature.shipped_opera_milestone = shipped_opera_milestone feature.shipped_opera_android_milestone = shipped_opera_android_milestone feature.footprint = int(self.request.get('footprint')) feature.visibility = int(self.request.get('visibility')) feature.ff_views = int(self.request.get('ff_views')) feature.ff_views_link = ff_views_link feature.ie_views = int(self.request.get('ie_views')) feature.ie_views_link = ie_views_link feature.safari_views = int(self.request.get('safari_views')) feature.safari_views_link = safari_views_link feature.prefixed = self.request.get('prefixed') == 'on' feature.spec_link = spec_link feature.standardization = int(self.request.get('standardization')) feature.comments = self.request.get('comments') feature.web_dev_views = int(self.request.get('web_dev_views')) feature.doc_links = doc_links feature.sample_links = sample_links feature.search_tags = search_tags else: # Check bug for existing blink component(s) used to label the bug. If # found, use the first component name instead of the generic "Blink" name. try: blink_components = self.__get_blink_component_from_bug(blink_components, bug_url) except Exception: pass feature = models.Feature( category=int(self.request.get('category')), name=self.request.get('name'), summary=self.request.get('summary'), owner=owners, bug_url=bug_url, blink_components=blink_components, impl_status_chrome=int(self.request.get('impl_status_chrome')), shipped_milestone=shipped_milestone, shipped_android_milestone=shipped_android_milestone, shipped_ios_milestone=shipped_ios_milestone, shipped_webview_milestone=shipped_webview_milestone, shipped_opera_milestone=shipped_opera_milestone, shipped_opera_android_milestone=shipped_opera_android_milestone, footprint=int(self.request.get('footprint')), visibility=int(self.request.get('visibility')), ff_views=int(self.request.get('ff_views')), ff_views_link=ff_views_link, ie_views=int(self.request.get('ie_views')), ie_views_link=ie_views_link, safari_views=int(self.request.get('safari_views')), safari_views_link=safari_views_link, prefixed=self.request.get('prefixed') == 'on', spec_link=spec_link, standardization=int(self.request.get('standardization')), comments=self.request.get('comments'), web_dev_views=int(self.request.get('web_dev_views')), doc_links=doc_links, sample_links=sample_links, search_tags=search_tags, ) key = feature.put() # TODO(ericbidelman): enumerate and remove only the relevant keys. memcache.flush_all() params = [] if self.request.get('create_launch_bug') == 'on': params.append(self.LAUNCH_PARAM) if self.request.get('intent_to_implement') == 'on': params.append(self.INTENT_PARAM) redirect_url = '/feature/' + str(key.id()) if len(params): redirect_url = '%s/%s?%s' % (self.LAUNCH_URL, key.id(), '&'.join(params)) return self.redirect(redirect_url)
def _val(d): return m.Feature( location=location, name=name, date=d, value=round(random.random(), 3))