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()
Exemple #2
0
  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()
Exemple #8
0
  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)
Exemple #11
0
  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)
Exemple #12
0
 def _val(d):
     return m.Feature(
         location=location,
         name=name,
         date=d,
         value=round(random.random(), 3))