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)
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
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
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
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)
def on_create(self, docs): for doc in docs: self.is_valid(doc) set_original_creator(doc)
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)