Example #1
0
    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
Example #2
0
 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)
Example #3
0
 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)
Example #4
0
    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())
Example #5
0
 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
Example #6
0
    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()
Example #7
0
    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=[])
Example #8
0
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
Example #9
0
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})
Example #10
0
 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)
Example #11
0
 def save(self, *args, **kwargs):
     unique_aware_slugify(self, 'title', 'slug', group=self.group)
     super(BaseTaggableObjectModel, self).save(*args, **kwargs)
Example #12
0
 def save(self, *args, **kwargs):
     unique_aware_slugify(self, 'title', 'slug', group=self.group)
     super(TodoList, self).save(*args, **kwargs)