def on_create(self, docs):
        """Set default metadata."""

        for doc in docs:
            if not doc.get('guid'):
                doc['guid'] = generate_guid(type=GUID_NEWSML)
            set_original_creator(doc)
Esempio n. 2
0
 def on_create(self, docs):
     """Set default metadata."""
     planning_type = get_resource_service('planning_types').find_one(
         req=None, name='planning')
     for doc in docs:
         if 'guid' not in doc:
             doc['guid'] = generate_guid(type=GUID_NEWSML)
         doc[config.ID_FIELD] = doc['guid']
         self.validate_planning(doc)
         set_original_creator(doc)
         self._set_planning_event_info(doc, planning_type)
         self._set_coverage(doc)
         self.set_planning_schedule(doc)
         # set timestamps
         update_dates_for(doc)
    def on_create(self, docs):
        for doc in docs:
            date = utc_to_local(doc.get('tz') or app.config['DEFAULT_TIMEZONE'], doc.get('date'))
            _id = date.strftime(ID_DATE_FORMAT)

            items = self.find(where={'_id': _id})
            if items.count() > 0:
                raise SuperdeskApiError.badRequestError(
                    message="Featured story already exists for this date.")

            self.validate_featured_attrribute(doc.get('items'))
            doc['_id'] = _id
            self.post_featured_planning(doc)
            # set the author
            set_original_creator(doc)

            # set timestamps
            update_dates_for(doc)
    def _duplicate_event(updates, original, events_service):
        new_event = deepcopy(original)
        new_event.update(updates)

        for f in {'_id', 'guid', 'unique_name', 'unique_id', 'lock_user', 'lock_time',
                  'lock_session', 'lock_action', '_created', '_updated', '_etag', 'pubstatus',
                  'reason', 'duplicate_to', 'duplicate_from', 'reschedule_to'}:
            new_event.pop(f, None)

        new_event[ITEM_STATE] = WORKFLOW_STATE.DRAFT
        new_event['guid'] = generate_guid(type=GUID_NEWSML)
        new_event['_id'] = new_event['guid']
        new_event['reschedule_from'] = original[config.ID_FIELD]
        new_event['_reschedule_from_schedule'] = original['dates']['start']
        set_original_creator(new_event)

        created_event = events_service.create([new_event])[0]
        history_service = get_resource_service('events_history')
        history_service.on_reschedule_from(new_event)
        return created_event
Esempio n. 5
0
    def _duplicate_event(updates, original, events_service):
        new_event = deepcopy(original)
        new_event.update(updates)

        # Remove fields not required by new events
        EventsRescheduleService.remove_fields(new_event)

        new_event[ITEM_STATE] = WORKFLOW_STATE.DRAFT
        new_event['guid'] = generate_guid(type=GUID_NEWSML)
        new_event['_id'] = new_event['guid']
        new_event['reschedule_from'] = original[config.ID_FIELD]
        new_event['_reschedule_from_schedule'] = original['dates']['start']
        new_event.pop('state_reason', None)
        set_original_creator(new_event)
        EventsRescheduleService.set_planning_schedule(new_event)

        created_event = events_service.create([new_event])[0]
        history_service = get_resource_service('events_history')
        history_service.on_reschedule_from(new_event)
        return created_event
Esempio n. 6
0
    def _create_event(self, date, updates, original, time_delta):
        # Create a copy of the metadata to use for the new event
        new_event = deepcopy(original)
        new_event.update(deepcopy(updates))

        # Remove fields not required by new events
        EventsUpdateRepetitionsService.remove_fields(new_event,
                                                     extra_fields=['reschedule_from', 'pubstatus'])

        new_event['state'] = WORKFLOW_STATE.DRAFT
        for key in list(new_event.keys()):
            if key.startswith('_') or key.startswith('lock_'):
                new_event.pop(key)

        # Set the new start and end dates, as well as the _id and guid fields
        new_event['dates']['start'] = date
        new_event['dates']['end'] = date + time_delta
        new_event[config.ID_FIELD] = new_event['guid'] = generate_guid(type=GUID_NEWSML)
        set_original_creator(new_event)
        self.set_planning_schedule(new_event)

        return new_event
Esempio n. 7
0
    def _set_coverage(self, updates, original=None):
        if not original:
            original = {}

        # [SDESK-3073]: Commenting the following section as we cannot reproduce the ******
        # scenario where a patch is sent without any coverages (unless all coverages are removed)
        # if not updates.get('coverages'):
        # # If the description text has changed, make sure to update the assignment(s)
        # if updates.get('description_text') or updates.get('internal_note'):
        # for coverage in (original.get('coverages') or []):
        # self._create_update_assignment(original, updates, coverage, coverage)
        # return
        # ********* [SDESK-3073]: End revert ***************"""

        for coverage in original.get('coverages') or []:
            updated_coverage = next(
                (cov for cov in updates.get('coverages') or []
                 if cov.get('coverage_id') == coverage.get('coverage_id')),
                None)

            assignment = coverage.get('assigned_to', None)
            if not updated_coverage:
                if assignment and assignment.get(
                        'state') != WORKFLOW_STATE.DRAFT:
                    raise SuperdeskApiError.badRequestError(
                        'Assignment already exists. Coverage cannot be deleted.'
                    )
                else:
                    updated_coverage = deepcopy(coverage)
                    updated_coverage.pop('assigned_to', None)
                    self._create_update_assignment(original, updates,
                                                   updated_coverage, coverage)

        for coverage in (updates.get('coverages') or []):
            original_coverage = None
            coverage_id = coverage.get('coverage_id')
            if not coverage_id or TEMP_ID_PREFIX in coverage_id:
                # coverage to be created
                coverage['coverage_id'] = generate_guid(type=GUID_NEWSML)
                coverage['firstcreated'] = utcnow()
                set_original_creator(coverage)
            else:
                original_coverage = next(
                    (cov for cov in original.get('coverages') or []
                     if cov['coverage_id'] == coverage_id), None)
                if not original_coverage:
                    continue

                if self.coverage_changed(coverage, original_coverage):
                    user = get_user()
                    coverage['version_creator'] = str(user.get(
                        config.ID_FIELD)) if user else None
                    coverage['versioncreated'] = utcnow()
                    # If the internal note has changed send a notification, except if it's been cancelled
                    if coverage.get('planning', {}).get('internal_note', '') != original_coverage.get('planning',
                                                                                                      {}).get(
                        'internal_note', '') \
                            and coverage.get('news_coverage_status', {}).get('qcode') != 'ncostat:notint':
                        target_user = coverage.get(
                            'assigned_to',
                            original_coverage.get('assigned_to',
                                                  {})).get('user', None)
                        target_desk = coverage.get(
                            'assigned_to',
                            original_coverage.get('assigned_to',
                                                  {})).get('desk', None)
                        PlanningNotifications().notify_assignment(
                            coverage_status=coverage.get('workflow_status'),
                            target_desk=target_desk
                            if target_user is None else None,
                            target_user=target_user,
                            message='assignment_internal_note_msg',
                            coverage_type=get_coverage_type_name(
                                coverage.get('planning',
                                             {}).get('g2_content_type', '')),
                            slugline=coverage.get('planning',
                                                  {}).get('slugline', ''),
                            internal_note=coverage.get('planning', {}).get(
                                'internal_note', ''))
                    # If the scheduled time for the coverage changes
                    if coverage.get('planning', {}).get('scheduled', datetime.min).strftime('%c') != \
                            original_coverage.get('planning', {}).get('scheduled', datetime.min).strftime('%c'):
                        target_user = coverage.get(
                            'assigned_to',
                            original_coverage.get('assigned_to',
                                                  {})).get('user', None)
                        target_desk = coverage.get(
                            'assigned_to',
                            original_coverage.get('assigned_to',
                                                  {})).get('desk', None)
                        PlanningNotifications().notify_assignment(
                            coverage_status=coverage.get('workflow_status'),
                            target_desk=target_desk
                            if target_user is None else None,
                            target_user=target_user,
                            message='assignment_due_time_msg',
                            due=utc_to_local(
                                app.config['DEFAULT_TIMEZONE'],
                                coverage.get(
                                    'planning',
                                    {}).get('scheduled')).strftime('%c'),
                            coverage_type=get_coverage_type_name(
                                coverage.get('planning',
                                             {}).get('g2_content_type', '')),
                            slugline=coverage.get('planning',
                                                  {}).get('slugline', ''))

            self._create_update_assignment(original, updates, coverage,
                                           original_coverage)
Esempio n. 8
0
 def on_create(self, docs):
     for doc in docs:
         self.is_valid(doc)
         set_original_creator(doc)
Esempio n. 9
0
    def on_create(self, docs):
        # events generated by recurring rules
        generated_events = []
        for event in docs:
            # generates an unique id
            if 'guid' not in event:
                event['guid'] = generate_guid(type=GUID_NEWSML)
            event[config.ID_FIELD] = event['guid']

            # family_id get on ingest we don't need it planning
            event.pop('family_id', None)

            # set the author
            set_original_creator(event)

            # set timestamps
            update_dates_for(event)

            # overwrite expiry date
            overwrite_event_expiry_date(event)

            # We ignore the 'update_method' on create
            if 'update_method' in event:
                del event['update_method']

            # Remove the 'expired' flag if it is set, as no new Event can be created
            # as expired
            if 'expired' in event:
                del event['expired']

            set_planning_schedule(event)
            planning_item = event.get('_planning_item')

            # validate event
            self.validate_event(event)

            # generates events based on recurring rules
            if event['dates'].get('recurring_rule', None):
                recurring_events = generate_recurring_events(event)
                generated_events.extend(recurring_events)
                # remove the event that contains the recurring rule. We don't need it anymore
                docs.remove(event)

                # Set the current Event to the first Event in the new series
                # This will make sure the ID of the Event can be used when
                # using 'event' from here on, such as when linking to a Planning item
                event = recurring_events[0]
                # And set the Planning Item from the original
                # (generate_recurring_events removes this field)
                event['_planning_item'] = planning_item

            if event['state'] == 'ingested':
                events_history = get_resource_service('events_history')
                events_history.on_item_created([event])

            if planning_item:
                self._link_to_planning(event)
                del event['_planning_item']

        if generated_events:
            docs.extend(generated_events)
 def on_create(self, docs):
     for doc in docs:
         set_original_creator(doc)
         self.set_schedule(doc)