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)
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)
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 ''
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 })
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)
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 })
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)
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)
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})
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 ''
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)
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}))
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 ''
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 })
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)
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 ''
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)
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))
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/', '#/')
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 '#'
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)
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)
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)
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), "<i>%s</i> %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)
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')}))
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)
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)
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
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