def save(self, *args, **kwargs): created = bool(self.pk is None) slugs = [self.slug] if self.slug else [] self.name = clean_single_line_text(self.name) current_portal = self.portal or CosinnusPortal.get_current() unique_aware_slugify(self, 'name', 'slug', portal_id=current_portal) if not self.slug: raise ValidationError(_('Slug must not be empty.')) slugs.append(self.slug) # sanity check for missing media_tag: if not self.media_tag: from cosinnus.models.tagged import get_tag_object_model media_tag = get_tag_object_model()._default_manager.create() self.media_tag = media_tag # FIXME: This shouldn't be necessary, but throws an error if missing self.media_tag.save() # set portal to current if created and not self.portal: self.portal = CosinnusPortal.get_current() super(CosinnusOrganization, self).save(*args, **kwargs) self._clear_cache(slugs=slugs) # force rebuild the pk --> slug cache. otherwise when we query that, this group might not be in it self.__class__.objects.get_pks(force=True) self._portal_id = self.portal_id self._slug = self.slug
def save(self, *args, **kwargs): slugs = [self.slug] if self.slug else [] unique_aware_slugify(self, 'name', 'slug') if not self.slug: raise ValidationError(_('Slug must not be empty.')) super(CosinnusGroup, self).save(*args, **kwargs) slugs.append(self.slug) self._clear_cache(slug=self.slug)
def save(self, *args, **kwargs): created = bool(self.pk is None) current_portal = self.portal or CosinnusPortal.get_current() unique_aware_slugify(self, 'title', 'slug', portal_id=current_portal) if not self.slug: raise ValidationError(_('Slug must not be empty.')) # set portal to current if created and not self.portal: self.portal = CosinnusPortal.get_current() super(UserDashboardAnnouncement, self).save(*args, **kwargs)
def post(self, request, *args, **kwargs): self.object = self.get_object() event = self.object if self.object.state != Event.STATE_VOTING_OPEN: messages.error( request, _('This is event is already scheduled. You cannot vote for it any more.' )) return HttpResponseRedirect(self.object.get_absolute_url()) if 'suggestion_id' not in kwargs: messages.error( request, _('Event cannot be completed: No date was supplied.')) return HttpResponseRedirect(self.object.get_absolute_url()) suggestion = get_object_or_404(Suggestion, pk=kwargs.get('suggestion_id')) old_doodle_pk = event.pk # give this a new temporary slug so the original one is free again event.slug += '-archive' unique_aware_slugify(event, 'title', 'slug', group=self.group, force_redo=True) event.created = now() event.save(update_fields=['slug', 'created']) # 'clone' media_tag new_media_tag = event.media_tag new_media_tag.pk = None new_media_tag.save() event.pk = None # set pk to None to have this become a new event event.slug = None # set slug to None so we can re-unique slugify event.media_tag = new_media_tag event.from_date = suggestion.from_date event.to_date = suggestion.to_date event.state = Event.STATE_SCHEDULED event.save(created_from_doodle=True) # re-retrieve old doodle, set it to archived doodle = self.model.objects.get(pk=old_doodle_pk) doodle.state = Event.STATE_ARCHIVED_DOODLE doodle.save(update_fields=['state']) # link old doodle to new event. can't do this until now because we wouldn't have had the old pointer correctly event.original_doodle = doodle event.save(update_fields=['original_doodle']) messages.success( request, _('The event was created successfully at the specified date.')) return HttpResponseRedirect(self.object.get_absolute_url())
def save(self, *args, **kwargs): created = bool(self.pk) == False unique_aware_slugify(self, 'title', 'slug', group=self.group) self.title = clean_single_line_text(self.title) if hasattr(self, '_media_tag_cache'): del self._media_tag_cache super(BaseTaggableObjectModel, self).save(*args, **kwargs) if not getattr(self, 'media_tag', None): self.media_tag = get_tag_object_model().objects.create() self.save() if created: pass
def save(self, *args, **kwargs): created = bool(self.pk is None) slugs = [self.slug] if self.slug else [] self.title = clean_single_line_text(self.title) unique_aware_slugify(self, 'title', 'slug', group_id=self.group_id) if not self.slug: raise ValidationError(_('Slug must not be empty.')) slugs.append(self.slug) super(CosinnusConferenceRoom, self).save(*args, **kwargs) # initialize/sync room-type-specific extras self.ensure_room_type_dependencies()
def save(self, *args, **kwargs): created = bool(self.pk is None) slugs = [self.slug] if self.slug else [] self.title = clean_single_line_text(self.title) current_portal = self.portal or CosinnusPortal.get_current() unique_aware_slugify(self, 'title', 'slug', portal_id=current_portal) if not self.slug: raise ValidationError(_('Slug must not be empty.')) slugs.append(self.slug) # sanity check for missing media_tag: if not self.media_tag: from cosinnus.models.tagged import get_tag_object_model media_tag = get_tag_object_model()._default_manager.create() self.media_tag = media_tag if created and not self.portal: # set portal to current self.portal = CosinnusPortal.get_current() super(CosinnusIdea, self).save(*args, **kwargs) self._clear_cache(slugs=slugs) # force rebuild the pk --> slug cache. otherwise when we query that, this group might not be in it self.__class__.objects.get_pks(force=True) self._portal_id = self.portal_id self._slug = self.slug if created: forum_slug = getattr(settings, 'NEWW_FORUM_GROUP_SLUG', None) if forum_slug: forum_group = get_object_or_None( get_cosinnus_group_model(), slug=forum_slug, portal=CosinnusPortal.get_current()) if forum_group: # send creation signal signals.idea_object_ceated.send(sender=self, group=forum_group) # we need to patch a group onto the idea, because notifications need a group setattr(self, 'group', forum_group) # the audience is empty because this is a moderator-only notification cosinnus_notifications.idea_created.send(sender=self, user=self.creator, obj=self, audience=[])
def get_or_create_attachment_folder(group): attachment_folder = None try: attachment_folder = FileEntry.objects.get(is_container=True, group=group, special_type='attached') except FileEntry.DoesNotExist: pgettext('special_folder_type', 'Attachments') # leave this for i18n to find! attachment_folder = FileEntry(title='Attachments', is_container=True, group=group, special_type='attached') unique_aware_slugify(attachment_folder, 'title', 'slug') attachment_folder.path = '/%s/' % attachment_folder.slug attachment_folder.save() return attachment_folder
def sync_hidden_conference_proxy_event(sender, group, user, **kwargs): """ For conferences that have a from_date and to_date set, create and keep in sync a single event with `is_hidden_group_proxy=True`, that has the same name and datetime as the conference itself. This event can be used in all normal views and querysets to display and handle the conference as proxy. Set related_groups in the conference to have the conference's proxy-event be displayed as one of those related_group's own event. """ try: if group.pk and group.group_is_conference: proxy_event = get_object_or_None(Event, group=group, is_hidden_group_proxy=True) if proxy_event: if group.from_date is None or group.to_date is None: proxy_event.delete() return elif group.from_date is not None and group.to_date is not None: # only create proxy events for conferences with from_date and to_date set proxy_event = Event( group=group, is_hidden_group_proxy=True, state=Event.STATE_SCHEDULED, creator=user, ) else: return # sync and save if proxy event and group differ in key attributes sync_attributes = [('name', 'title'), ('from_date', 'from_date'), ('to_date', 'to_date')] if any( getattr(proxy_event, attr[1]) != getattr(group, attr[0]) for attr in sync_attributes): for attr in sync_attributes: setattr(proxy_event, attr[1], getattr(group, attr[0])) # set proxy event's slug to something unreachable so it never clashes with a real event if not proxy_event.slug: unique_aware_slugify(proxy_event, 'title', 'slug', group=proxy_event.group) proxy_event.slug = '__proxy__-' + proxy_event.slug proxy_event.save() # set proxy event to visible everywhere (since groups are visible anywhere as well) if not proxy_event.media_tag.visibility == BaseTagObject.VISIBILITY_ALL: proxy_event.media_tag.visibility = BaseTagObject.VISIBILITY_ALL proxy_event.media_tag.save() # for each related_group in the conference, reflect the proxy event into that group # and delete stale reflections ct = ContentType.objects.get_for_model(Event) prev_qs = BaseTaggableObjectReflection.objects.filter( content_type=ct, object_id=proxy_event.id) previous_reflections = dict( (reflection.id, reflection) for reflection in prev_qs) for related_group in group.related_groups.all(): attrs = { 'content_type': ct, 'object_id': proxy_event.id, 'group': related_group, } existing_reflection = get_object_or_None( BaseTaggableObjectReflection, **attrs) if existing_reflection: # reflection exists and we can leave it. remove it from the dict del previous_reflections[existing_reflection.id] else: # create new reflection attrs.update({ 'creator': user, }) BaseTaggableObjectReflection.objects.create(**attrs) # delete all stale reflections # (the ones that exist but their groups are no longer tagged as related_group) for stale_reflection in previous_reflections.values(): stale_reflection.delete() except Exception as e: logger.error( 'An error in cosinnus_event.hooks prevented saving the conference proxy events!', extra={'exception': e})
def save(self, *args, **kwargs): unique_aware_slugify(self, 'title', 'slug', group=self.group) self.title = clean_single_line_text(self.title) super(TodoList, self).save(*args, **kwargs)
def save(self, *args, **kwargs): unique_aware_slugify(self, 'title', 'slug', group=self.group) super(BaseTaggableObjectModel, self).save(*args, **kwargs)
def save(self, *args, **kwargs): unique_aware_slugify(self, 'title', 'slug', group=self.group) super(TodoList, self).save(*args, **kwargs)