Example #1
0
 def get_edit_url(self):
     kwargs = {'group': self.group, 'slug': self.slug}
     if self.state == Event.STATE_VOTING_OPEN or self.state == Event.STATE_ARCHIVED_DOODLE:
         return group_aware_reverse('cosinnus:event:doodle-edit',
                                    kwargs=kwargs)
     elif self.is_hidden_group_proxy:
         # hidden proxy events redirect to the group
         return self.group.get_edit_url()
     return group_aware_reverse('cosinnus:event:event-edit', kwargs=kwargs)
Example #2
0
 def get_absolute_url(self):
     kwargs = {'group': self.group, 'slug': self.slug}
     if self.state == Event.STATE_VOTING_OPEN:
         return group_aware_reverse('cosinnus:event:doodle-vote',
                                    kwargs=kwargs)
     elif self.state == Event.STATE_ARCHIVED_DOODLE:
         return group_aware_reverse('cosinnus:event:doodle-archived',
                                    kwargs=kwargs)
     return group_aware_reverse('cosinnus:event:event-detail',
                                kwargs=kwargs)
Example #3
0
 def title_url(self):
     if self.config.type == WidgetConfig.TYPE_MICROSITE:
         return ''
     if self.config.group:
         return group_aware_reverse('cosinnus:group-detail',
                                    kwargs={'group': self.config.group})
     return ''
Example #4
0
 def get_success_url(self):
     return group_aware_reverse('cosinnus:todo:todo-in-list-list',
                                kwargs={
                                    'group': self.group,
                                    'listslug': self.todolist.slug,
                                    'todoslug': self.object.slug
                                })
Example #5
0
    def get(self, request, *args, **kwargs):
        # get room slug if one was in URL, else try finding the first sorted room
        # self.room can be None!
        self.room = None
        # discard the event_id kwarg, it is only for the frontend
        kwargs.pop('event_id', None)
        if not 'slug' in kwargs:
            first_room = self.group.rooms.visible().first()
            if first_room:
                return redirect(first_room.get_absolute_url())
        else:
            room_slug = kwargs.pop('slug')
            self.room = get_object_or_None(CosinnusConferenceRoom,
                                           group=self.group,
                                           slug=room_slug)
        if self.room and not self.room.is_visible:
            if not check_user_superuser(request.user) and not check_ug_admin(
                    request.user, self.group):
                return HttpResponseForbidden()

        self.rooms = self.group.rooms.all()
        if self.rooms.count() == 0 and (check_ug_admin(request.user,
                                                       self.group)
                                        or check_user_superuser(request.user)):
            # if no rooms have been created, redirect group admins to room management
            return redirect(
                group_aware_reverse('cosinnus:conference:room-management',
                                    kwargs={'group': self.group}))

        return super(ConferencePageView, self).get(request, *args, **kwargs)
Example #6
0
 def get_delete_url(self):
     return group_aware_reverse('cosinnus:event:conference-event-delete',
                                kwargs={
                                    'group': self.group,
                                    'room_slug': self.room.slug,
                                    'slug': self.slug
                                })
Example #7
0
    def post(self, request, *args, **kwargs):
        if 'cosinnus_document' in settings.INSTALLED_APPS:
            pad = Etherpad.objects.get(slug=kwargs['slug'], group=self.group)
            title = self.get_title(request, pad.title)
            try:
                doc = Document.objects.get(title=title, group=self.group)
            except Document.DoesNotExist:
                doc = Document(title=title,
                               group=self.group,
                               created=request.user,
                               is_draft=False)
            doc.content = pad.content
            doc.save()

            msg = _(
                'Pad has been archived as Document: <a class="alert-link" href="%(href)s">%(title)s</a>'
            ) % {
                'href':
                group_aware_reverse('cosinnus:document:document-detail',
                                    kwargs={
                                        'group': self.group,
                                        'slug': doc.slug,
                                    }),
                'title':
                title,
            }
            messages.info(request, msg)
        return super(EtherpadArchiveDocumentView,
                     self).post(request, *args, **kwargs)
Example #8
0
def cosinnus_menu(context, template="cosinnus/navbar.html"):
    if 'request' not in context:
        raise ImproperlyConfigured("Current request missing in rendering "
            "context. Include 'django.core.context_processors.request' in the "
            "TEMPLATE_CONTEXT_PROCESSORS.")

    request = context['request']
    user = request.user
    if user.is_authenticated():
        context['groups'] = CosinnusProject.objects.get_for_user(request.user)
        context['societies'] = CosinnusSociety.objects.get_for_user(request.user)
        context['groups_invited'] = CosinnusProject.objects.get_for_user_invited(request.user)
        context['societies_invited'] = CosinnusSociety.objects.get_for_user_invited(request.user)
        if settings.COSINNUS_IDEAS_ENABLED:
            # TODO: cache
            context['my_ideas_count'] = CosinnusIdea.objects.all_in_portal().filter(creator=user).count()
    
    try:
        current_app = resolve(request.path).app_name
    except Resolver404:
        pass
    active_app = None
    active_app_name = None
    if 'group' in context:
        group = context['group']
        apps = []
        for app, name, label in list(app_registry.items()):
            if app in settings.COSINNUS_HIDE_APPS:
                continue
            if group.is_app_deactivated(app):
                continue
            
            url = group_aware_reverse('cosinnus:%s:index' % name, kwargs={'group': group})
            if app == current_app:
                active_app = app
                active_app_name = name
            apps.append({
                'active': app == current_app,
                'label': label,
                'url': url,
                'app': app,
            })
            
        apps = sorted(apps, key=lambda x: _appsmenu_apps_sort_key(x['app']))
        context.update({
            'apps': apps,
            'app_nav': True,
        })
        if group.type == CosinnusGroup.TYPE_PROJECT:
            context['appsmenu_group'] = group
        elif group.type == CosinnusGroup.TYPE_SOCIETY:
            context['appsmenu_society'] = group
    else:
        context['app_nav'] = False

    context.update({
        'active_app': active_app,
        'active_app_name': active_app_name,
    })
    return render_to_string(template, context)
Example #9
0
 def get_success_url(self):
     if self.object.is_container:
         messages.success(self.request,
             self.message_success_folder % {'title': self.object.title})
     return group_aware_reverse('cosinnus:file:list', kwargs={
             'group': self.group,
             'slug': self.object.slug})
Example #10
0
 def title_url(self):
     if self.config.type == WidgetConfig.TYPE_MICROSITE:
         return ''
     if self.config.group and self.request.user.is_authenticated:
         return group_aware_reverse('cosinnus:todo:list', kwargs={'group': self.config.group}) \
              + '?is_completed=0&assigned_to=%d' % self.request.user.id
     return ''
Example #11
0
def confirm_page_admin(request, group_id):
    """ GET to this view to try to obtain a user access token for a facebook fan-page 
        linked to the group_id supplied. Will always redirect to the group form's facebook tab. """
    if not request.user.is_authenticated():
        raise PermissionDenied

    group = get_object_or_404(get_cosinnus_group_model(), id=group_id)

    if not group.facebook_page_id:
        messages.error(
            request,
            _('This group does not have a Facebook Fan-Page associated with it!'
              ))

    if obtain_facebook_page_access_token_for_user(group,
                                                  group.facebook_page_id,
                                                  request.user):
        messages.success(
            request,
            _('Your Editor access for the linked Facebook Fan-Page was confirmed!'
              ))
    else:
        messages.warning(
            request,
            _('We could not obtain access to the Fan-Page for your connected Facebook Account. Please check that you entered the correct Fan-Page name, and that you are an Editor of that Fan-Page!'
              ))

    return redirect(
        group_aware_reverse('cosinnus:group-edit', kwargs={'group': group}) +
        '?tab=facebook',
        permanent=False)
Example #12
0
 def extra_dispatch_check(self):
     if not self.group.allow_conference_temporary_users:
         messages.warning(
             self.request,
             _('This function is not enabled for this conference.'))
         return redirect(
             group_aware_reverse('cosinnus:group-dashboard',
                                 kwargs={'group': self.group}))
Example #13
0
    def title_url(self):
        if self.config.type == WidgetConfig.TYPE_MICROSITE:
            return ''

        if self.config.group:
            return group_aware_reverse('cosinnus:%s:index' % self.app_name,
                                       kwargs={'group': self.config.group})
        return ''
Example #14
0
 def get_success_url(self):
     messages.success(self.request,
                      self.message_success % {'title': self.object.title})
     return group_aware_reverse('cosinnus:todo:list-list',
                                kwargs={
                                    'listslug': self.object.todolist.slug,
                                    'group': self.group
                                })
Example #15
0
 def render_to_response(self, *args, **kwargs):
     # conferences never show the group dashboard, they show the conference frontend
     # (for `COSINNUS_CONFERENCES_USE_COMPACT_MODE`, the redirecting is done via middleware)
     if self.group.group_is_conference:
         return redirect(
             group_aware_reverse('cosinnus:conference:index',
                                 kwargs={'group': self.group}))
     return super(GroupDashboard, self).render_to_response(*args, **kwargs)
Example #16
0
 def title_url(self):
     if self.config.type == WidgetConfig.TYPE_MICROSITE:
         return ''
     if self.config.group:
         return group_aware_reverse('cosinnus:etherpad:list',
                                    kwargs={'group': self.config.group
                                            }) + '?o=-created'
     return ''
Example #17
0
 def get_success_url(self):
     kwargs = {'group': self.group}
     # no self.object if get_queryset from add/edit view returns empty
     if hasattr(self, 'object'):
         kwargs['slug'] = self.object.slug
         urlname = 'cosinnus:event:doodle-vote'
     else:
         urlname = 'cosinnus:event:doodle-list'
     return group_aware_reverse(urlname, kwargs=kwargs)
Example #18
0
 def get_success_url(self):
     kwargs = {'group': self.group}
     try:
         # if possible, redirect to the object's parent folder list view
         parent_folder = self.object.__class__.objects.get(is_container=True, path=self.object.path)
         kwargs.update({'slug': parent_folder.slug})
     except:
         pass
     return "%s%s" % (group_aware_reverse('cosinnus:file:list', kwargs=kwargs), add_current_params(None, self.request))
Example #19
0
 def get_absolute_url(self):
     if settings.COSINNUS_CONFERENCES_USE_COMPACT_MODE:
         return super(ConferenceEvent, self).get_absolute_url()
     return group_aware_reverse('cosinnus:conference:room-event',
                                kwargs={
                                    'group': self.group,
                                    'slug': self.room.slug,
                                    'event_id': self.id
                                }).replace('%23/', '#/')
Example #20
0
    def title_url(self):
        if self.config.type == WidgetConfig.TYPE_MICROSITE:
            return ''

        if self.config.group:
            return group_aware_reverse('cosinnus:%s:index' % self.app_name,
                                       kwargs={'group': self.config.group})
        # return '#' as default url to prevent firefox dropping the <a> tag content
        return '#'
Example #21
0
 def get_success_url(self):
     kwargs = {'group': self.group}
     try:
         # if possible, redirect to the object's parent folder list view
         parent_folder = self.object.__class__.objects.get(
             is_container=True, path=self.object.path)
         kwargs.update({'slug': parent_folder.slug})
     except:
         pass
     return group_aware_reverse('cosinnus:etherpad:list', kwargs=kwargs)
Example #22
0
 def dispatch(self, request, *args, **kwargs):
     try:
         return super(TodoEntryAssignView,
                      self).dispatch(request, *args, **kwargs)
     except PermissionDenied:
         messages.error(request,
                        _('You are not allowed to assign this Todo entry.'))
         kwargs = {'group': self.group}
         url = group_aware_reverse('cosinnus:todo:list', kwargs=kwargs)
         return HttpResponseRedirect(url)
Example #23
0
 def get_absolute_url(self):
     if self.is_url:
         return self.url
     if self.is_image:
         kwargs = {'group': self.group}
         if self.container:
             kwargs['slug'] = self.container.slug
         return group_aware_reverse('cosinnus:file:list',
                                    kwargs=kwargs) + '?id=%s' % self.id
     kwargs = {
         'group':
         self.group,
         'slug':
         self.slug,
         'pretty_filename':
         clean_filename(self.sourcefilename.replace(' ', '-'))
     }
     return group_aware_reverse('cosinnus:file:pretty-download',
                                kwargs=kwargs)
Example #24
0
    def dispatch(self, request, *args, **kwargs):

        list_filter = None
        list_slug = kwargs.get('listslug', None)
        if list_slug:
            list_filter = {
                'slug': list_slug,
                'group__slug': kwargs.get('group'),
                'group__portal': CosinnusPortal.get_current()
            }
        elif request.method == 'GET':
            # if we navigate to the index, redirect to the default todolist instead, if it exists
            default_todolist_slug = settings.COSINNUS_TODO_DEFAULT_TODOLIST_SLUG
            default_list_filter = {
                'slug': default_todolist_slug,
                'group__slug': kwargs.get('group'),
                'group__portal': CosinnusPortal.get_current()
            }
            default_todolist = get_object_or_None(TodoList,
                                                  **default_list_filter)
            if default_todolist:
                return redirect(
                    group_aware_reverse('cosinnus:todo:list-list',
                                        kwargs={
                                            'group': kwargs.get('group'),
                                            'listslug': default_todolist.slug
                                        }))

        if list_filter:
            self.todolist = get_object_or_404(TodoList, **list_filter)
        else:
            self.todolist = None

        todo_slug = kwargs.get('todoslug', None)
        if todo_slug:
            self.todo = get_object_or_404(
                TodoEntry,
                slug=todo_slug,
                group__slug=kwargs.get('group'),
                group__portal=CosinnusPortal.get_current())
        else:
            self.todo = None

        # default filter for todos is completed=False
        if not 'is_completed' in request.GET:
            qdict = QueryDict('', mutable=True)
            qdict.update(request.GET)
            qdict.update(
                {'is_completed': 0}
            )  # set this to '0' instead of 0 to show the "active filter" bubble
            request.GET = qdict

        ret = super(TodoListCreateView, self).dispatch(request, *args,
                                                       **kwargs)
        return ret
    def __init__(self, *args, **kwargs):
        super(FormAttachableMixin, self).__init__(*args, **kwargs)

        # retrieve the attached objects ids to select them in the update view
        preresults = []
        if self.instance and self.instance.pk and self.instance.attached_objects is not None:
            for attached in self.instance.attached_objects.all():
                if attached and attached.target_object:
                    obj = attached.target_object
                    text_only = (
                        attached.model_name + ":" + str(obj.id),
                        "%s" % (obj.title),
                    )
                    #text_only = (attached.model_name+":"+str(obj.id), "&lt;i&gt;%s&lt;/i&gt; %s" % (attached.model_name, obj.title),)
                    # TODO: sascha: returning unescaped html here breaks the javascript of django-select2
                    html = build_attachment_field_result(
                        attached.model_name, obj)
                    preresults.append(text_only)

        # add a field for each model type of attachable file provided by cosinnus apps
        # each field's name is something like 'attached:cosinnus_file.FileEntry'
        # and fill the field with all available objects for that type (this is passed from our view)
        source_model_id = self._meta.model._meta.app_label + '.' + self._meta.model._meta.object_name

        # get target groups to add newly attached files to
        target_group = getattr(self, 'group', None)
        if not target_group:
            # if this form's model has no group, it may be a global object that can still have attachments,
            # so fall back to the forum group to add attached objects to. if this doesn't exist, attaching in not possible.
            forum_slug = getattr(settings, 'NEWW_FORUM_GROUP_SLUG', None)
            if forum_slug:
                target_group = get_object_or_None(
                    get_cosinnus_group_model(),
                    slug=forum_slug,
                    portal=CosinnusPortal.get_current())
        """ Add attachable objects field if this model is configured in settings.py to have objects that can be attached to it """
        if target_group and attached_object_registry.get_attachable_to(
                source_model_id):
            self.fields[
                'attached_objects'] = AttachableObjectSelect2MultipleChoiceField(
                    label=_("Attachments"),
                    help_text=_("Type the title and/or type of attachment"),
                    data_url=group_aware_reverse(
                        'cosinnus:attached_object_select2_view',
                        kwargs={
                            'group': target_group,
                            'model': source_model_id
                        }),
                    required=False)
            # we need to cheat our way around select2's annoying way of clearing initial data fields
            self.fields['attached_objects'].choices = preresults  #((1, 'hi'),)
            self.fields['attached_objects'].initial = [
                key for key, val in preresults
            ]  #[1]
            setattr(self, 'target_group', target_group)
Example #26
0
 def on_error(self, request, *args, **kwargs):
     """ Called when the require-read permission is not met """
     if not request.user.is_authenticated:
         return redirect_to_not_logged_in(request, view=self)
     messages.warning(
         request,
         _('You are not currently a member of %s! If you wish you can request to become a member below.'
           ) % self.group.name)
     return redirect(
         group_aware_reverse('cosinnus:group-list-filtered',
                             kwargs={'group': kwargs.get('group')}))
Example #27
0
 def get_success_url(self):
     messages.success(self.request,
                      self.message_success % {'title': self.object.title})
     kwargs = {'group': self.group}
     # no self.object if get_queryset from add/edit view returns empty
     if hasattr(self, 'object'):
         kwargs['slug'] = self.object.slug
         urlname = 'cosinnus:marketplace:detail'
     else:
         urlname = 'cosinnus:marketplace:list'
     return group_aware_reverse(urlname, kwargs=kwargs)
Example #28
0
    def __init__(self, haystack_result, obj, user, *args, **kwargs):
        group_admins = list(obj.actual_admins)
        message_url = None
        if not settings.COSINNUS_IS_INTEGRATED_PORTAL:
            message_url = message_group_admins_url(obj, group_admins)

        kwargs.update({
            'is_member':
            check_ug_membership(user, obj),
            'is_pending':
            check_ug_pending(user, obj),
            'is_invited':
            check_ug_invited_pending(user, obj),
            'action_url_1':
            _prepend_url(user, obj.portal) +
            group_aware_reverse('cosinnus:group-microsite',
                                kwargs={'group': obj},
                                skip_domain=True) + '?join=1',
            'action_url_2': (_prepend_url(user, obj.portal) +
                             message_url) if message_url else None,
            'youtube_url':
            obj.video,
            'twitter_username':
            obj.twitter_username,
            'flickr_url':
            obj.flickr_url,
            'website_url':
            obj.website,
            'contact':
            linebreaksbr(escape(obj.contact_info)),
        })
        """ TODO: check all read permissions on related objects! """

        # collect upcoming and visible project/group events
        sqs = SearchQuerySet().models(SEARCH_MODEL_NAMES_REVERSE['events'])
        sqs = sqs.filter_and(group=obj.id)
        sqs = filter_searchqueryset_for_read_access(sqs, user)
        sqs = filter_event_searchqueryset_by_upcoming(sqs)
        sqs = sqs.order_by('from_date')
        kwargs.update(
            {'events': [HaystackEventMapCard(result) for result in sqs]})

        # collect administrator users. these are *not* filtered by visibility, as project admins are always visible!
        sqs = SearchQuerySet().models(SEARCH_MODEL_NAMES_REVERSE['people'])
        sqs = sqs.filter_and(admin_groups=obj.id)
        #sqs = filter_searchqueryset_for_read_access(sqs, user)
        sqs = sqs.order_by('title')
        kwargs.update(
            {'admins': [HaystackUserMapCard(result) for result in sqs]})

        return super(DetailedBaseGroupMapResult,
                     self).__init__(haystack_result, obj, user, *args,
                                    **kwargs)
Example #29
0
    def _get_messages(self, channel, user_ids, since=None, format='old'):
        """
        Return messages in channel
        :return:
        """
        messages, attachments = [], []
        qs = Message.objects.filter(
            sender__in=user_ids,
            #sender_archived=False,
            #recipient_archived=False,
            moderation_status=STATUS_ACCEPTED,
        )
        qs = qs.exclude(sender_deleted_at__isnull=False,
                        recipient_deleted_at__isnull=False)
        qs = qs.filter(Q(id=channel[0]) | Q(thread_id=channel[0]))
        if since:
            qs = qs.filter(sent_at__gte=since)
        qs = qs.order_by('sent_at')
        for message in qs:
            text = self.format_message(message.body)
            # if message.thread_id == message.id and message.subject:
            if message.subject:
                text = f"*{message.subject}*\n{text}"
            timestamp = int(message.sent_at.timestamp() * 1000)
            sender_profile = message.sender.cosinnus_profile
            if not sender_profile:
                continue
            if format == 'old':
                messages.append(
                    [sender_profile.rocket_username, timestamp, text])
            else:
                recipient_profile = message.recipient.cosinnus_profile
                if not recipient_profile:
                    continue
                messages.append([
                    sender_profile.rocket_username,
                    recipient_profile.rocket_username, timestamp, text
                ])

            for att in message.attached_objects.all():
                fileentry = att.target_object
                if not fileentry:
                    continue
                url = group_aware_reverse('cosinnus:file:rocket-download',
                                          kwargs={
                                              'group': fileentry.group,
                                              'slug': att.target_object.slug
                                          })
                if not fileentry:
                    continue
                attachments.append(
                    [sender_profile.rocket_username, timestamp, url])
        return messages, attachments
Example #30
0
def redirect_to_403(request, view=None, group=None):
    """ Returns a redirect to the login page with a next-URL parameter and an error message 
        @param group: If supplied, the user will in most cases be redirected to the group's micropage instead """
    # support for the ajaxable view mixin
    if view and getattr(view, 'is_ajax_request_url', False):
        return HttpResponseForbidden('Not authenticated')
    # redirect to group's micropage and give permission denied Error message, but not 403
    if group is not None:
        # only redirect to micropage if user isn't a member of the group
        if not request.user.is_authenticated or not request.user.id in group.members:
            messages.warning(request, _('Only team members can see the content you requested. Apply to become a member now!'))
            return redirect(group_aware_reverse('cosinnus:group-dashboard', kwargs={'group': group}))
    raise PermissionDenied