示例#1
0
    def clean(self, value):
        """ We organize the ids gotten back from the recipient select2 field.
            This is a list of mixed ids which could either be groups or users.
            See cosinnus_messages.views.UserSelect2View for how these ids are built.
            
            Example for <value>: [u'user:1', u'group:4'] 
        """

        if self.required and not value:
            raise ValidationError(self.error_messages['required'])

        user_ids, group_ids = self.get_user_and_group_ids_for_value(value)

        # add group members to the list
        groups = CosinnusGroup.objects.get_cached(pks=group_ids)
        recipients = set()
        for group in groups:
            group_members = get_user_model().objects.filter(
                id__in=group.members)
            recipients.update(filter_active_users(group_members))

        # combine the groups users with the directly selected users
        recipients.update(
            filter_active_users(User.objects.filter(id__in=user_ids)))

        return list(recipients)
示例#2
0
    def get_statistics(self, from_date, to_date):
        """ Actual collection of data """
        created_users = filter_active_users(get_user_model().objects.filter(id__in=CosinnusPortal.get_current().members))\
            .filter(date_joined__gte=from_date, date_joined__lte=to_date).count()
        active_users = filter_active_users(get_user_model().objects.filter(id__in=CosinnusPortal.get_current().members))\
            .filter(date_joined__lte=to_date).count()
        created_projects = CosinnusProject.objects.filter(
            portal=CosinnusPortal.get_current(),
            is_active=True,
            created__gte=from_date,
            created__lte=to_date).count()
        created_groups = CosinnusSociety.objects.filter(
            portal=CosinnusPortal.get_current(),
            is_active=True,
            created__gte=from_date,
            created__lte=to_date).count()
        active_projects = CosinnusProject.objects.filter(
            portal=CosinnusPortal.get_current(),
            is_active=True,
            created__lte=to_date).count()
        active_groups = CosinnusSociety.objects.filter(
            portal=CosinnusPortal.get_current(),
            is_active=True,
            created__lte=to_date).count()

        statistics = {
            '1. New Registered Users': created_users,
            '2. Active Users': active_users,
            '3. New Created Projects': created_projects,
            '4. Active Projects': active_projects,
            '5. New Created Groups': created_groups,
            '6. Active Groups': active_groups,
        }
        try:
            from cosinnus_event.models import Event
            created_event_count = Event.objects.filter(
                group__portal=CosinnusPortal.get_current(),
                created__gte=from_date,
                created__lte=to_date).count()
            statistics.update({
                '7. Created Events': created_event_count,
            })
        except:
            pass

        try:
            from cosinnus_note.models import Note
            created_note_count = Note.objects.filter(
                group__portal=CosinnusPortal.get_current(),
                created__gte=from_date,
                created__lte=to_date).count()
            statistics.update({
                '8. Created News': created_note_count,
            })
        except:
            pass
        statistics = sorted(statistics.items())
        return statistics
示例#3
0
def general(request):
    """ Returns a JSON dict of common statistics for this portal """
    
    all_users_qs = get_user_model().objects.filter(id__in=CosinnusPortal.get_current().members)
    data = {
        'groups': CosinnusSociety.objects.all_in_portal().count(),
        'projects': CosinnusProject.objects.all_in_portal().count(),
        'users_registered': all_users_qs.count(),
        'users_active': filter_active_users(all_users_qs).count(),
    }
    try:
        from cosinnus_event.models import Event
        upcoming_event_count = Event.get_current_for_portal().count()
        data.update({
            'events_upcoming': upcoming_event_count,      
        })
    except:
        pass
    
    try:
        from cosinnus_note.models import Note
        note_count = Note.get_current_for_portal().count()
        data.update({
            'notes': note_count,      
        })
    except:
        pass
    
    return JsonResponse(data)
示例#4
0
    def get_results(self, request, term, page, context):
        term = term.lower()
        start = (page - 1) * 10
        end = page * 10

        User = get_user_model()

        uids = self.group.members

        # if this is a Project, add all users of its parent Group as well
        # (disabled for now as it leads to a lot of confusion)
        # if self.group.parent:
        #    uids = list(set(uids + self.group.parent.members))

        terms = term.strip().lower().split(' ')
        q = get_user_query_filter_for_search_terms(terms)

        user_qs = filter_active_users(
            User.objects.filter(id__in=uids).filter(q))

        count = user_qs.count()
        if count < start:
            raise Http404
        has_more = count > end

        users = user_qs.all()[start:end]
        #results = get_user_choices(users)
        results = get_user_select2_pills(users)

        return (NO_ERR_RESP, has_more, results)
示例#5
0
def reset_user_tos_flags(request=None):
    if request and not request.user.is_superuser:
        return HttpResponseForbidden('Not authenticated')

    if not request.GET.get('confirm', False) == '1':
        active_users = filter_active_users(get_user_model().objects.all())
        ret = '********** This will reset all %d active users\' ToS accepted flag! Use param ?confirm=1 to delete the flags! ***********' % active_users.count()
    else:
        count = 0
        active_users = filter_active_users(get_user_model().objects.all())
        for profile in get_user_profile_model().objects.all().filter(user__in=active_users):
            del profile.settings['tos_accepted']
            profile.save(update_fields=['settings'])
            count += 1
        ret = 'Successfully reset the ToS flag for %d users.' % count
        
    return HttpResponse(ret)
示例#6
0
    def get_data(self, offset=0):
        """ Returns a tuple (data, rows_returned, has_more) of the rendered data and how many items were returned.
            if has_more == False, the receiving widget will assume no further data can be loaded.
         """
        group = self.config.group
        if group is None:
            return ''

        # how many members display. it's -1 because the last tile is always the "+72 members"
        count = getattr(settings, 'COSINNUS_GROUP_MEMBER_WIDGET_USER_COUNT',
                        19)

        admin_ids = CosinnusGroupMembership.objects.get_admins(group=group)
        member_ids = CosinnusGroupMembership.objects.get_members(group=group)
        all_ids = set(admin_ids + member_ids)

        userprofile_table = get_user_profile_model()._meta.db_table
        qs = filter_active_users(get_user_model().objects.all()) \
            .select_related('cosinnus_profile') \
            .extra(select={
                'has_avatar': 'LENGTH(%s.avatar) > 0' % userprofile_table
            }) \
            .order_by('-has_avatar', 'first_name', 'last_name')
        qs = qs.filter(id__in=all_ids)

        self.member_count = qs.count()
        hidden_member_count = 0

        is_member_of_this_group = self.request.user.pk in all_ids
        if not self.request.user.is_authenticated:
            visibility_level = BaseTagObject.VISIBILITY_ALL
        elif not is_member_of_this_group:
            visibility_level = BaseTagObject.VISIBILITY_GROUP
        else:
            visibility_level = -1

        # show VISIBILITY_ALL users to anonymous users, VISIBILITY_GROUP to logged in users,
        # and all members to group-members
        if visibility_level != -1:
            qs = qs.filter(
                cosinnus_profile__media_tag__visibility__gte=visibility_level)
            hidden_member_count = self.member_count - len(qs)

        has_more = len(qs) > offset + count or hidden_member_count > 0
        more_count = max(0, len(qs) - (offset + count)) + hidden_member_count

        if count != 0:
            qs = qs[offset:offset + count]

        data = {
            'group': group,
            'members': qs,
            'has_more': has_more,
            'more_count': more_count,
        }
        return (render_to_string('cosinnus/widgets/group_members.html',
                                 data), len(qs), has_more)
示例#7
0
 def get_context_data(self, **kwargs):
     context = super(InteractiveTodoEntryMixin,
                     self).get_context_data(**kwargs)
     context.update({
         'group_users':
         filter_active_users(get_user_model().objects.filter(
             id__in=self.group.members).prefetch_related(
                 'cosinnus_profile'))
     })
     return context
示例#8
0
 def get_queryset(self):
     
     # get all users from this portal only        
     # we also exclude users who have never logged in
     all_users = filter_active_users(super(UserListView, self).get_queryset().filter(id__in=CosinnusPortal.get_current().members))
     
     if self.request.user.is_authenticated():
         visibility_level = BaseTagObject.VISIBILITY_GROUP
     else:
         visibility_level = BaseTagObject.VISIBILITY_ALL
     
     # only show users with the visibility level
     qs = all_users.filter(cosinnus_profile__media_tag__visibility__gte=visibility_level)
     self.hidden_users = all_users.exclude(cosinnus_profile__media_tag__visibility__gte=visibility_level)
     
     qs = qs.order_by('first_name', 'last_name')
     qs = qs.select_related('cosinnus_profile')
     return qs
 def handle(self, *args, **options):
     try:
         initialize_cosinnus_after_startup()
         self.stdout.write(
             "Checking active users and creating any missing nextcloud user accounts."
         )
         counter = 0
         created = 0
         errors = 0
         all_users = filter_active_users(filter_portal_users(get_user_model().objects.all()))
         
         # retrieve all existing users so we don't create them anew
         existing_nc_users = list_all_users()
         total_users = len(all_users)
         for user in all_users:
             counter += 1
             
             # only add user if not already in NC user DB with their id
             if not get_nc_user_id(user) in existing_nc_users:
                 try:
                     create_user_from_obj(user)
                     created += 1
                 except OCSException as e:
                     if not e.statuscode == 102:  # 102: user already exists
                         errors += 1
                         self.stdout.write(
                             f"Error: OCSException: '{e.message}' ({e.statuscode})"
                         )
                 except Exception as e:
                     if settings.DEBUG:
                         raise
                     errors += 1
                     self.stdout.write("Error: Exception: " + str(e))
             self.stdout.write(
                 f"{counter}/{total_users} users checked, {created} nextcloud users created ({errors} Errors)",
                 ending="\r",
             )
             self.stdout.flush()
         self.stdout.write(
             f"Done! {counter}/{total_users} users checked, {created} nextcloud users created ({errors} Errors)."
         )
     except Exception as e:
         if settings.DEBUG:
             raise
示例#10
0
    def get(self, request, *args, **kwargs):
        all_users_qs = self.get_user_qs()
        data = {
            'groups': self.get_society_qs().count(),
            'projects': self.get_project_qs().count(),
            'users_registered': all_users_qs.count(),
            'users_active': filter_active_users(all_users_qs).count(),
        }
        try:
            data.update({
                'events_upcoming': self.get_event_qs().count(),
            })
        except:
            pass

        try:
            data.update({
                'notes': self.get_note_qs().count(),
            })
        except:
            pass

        return Response(data)
示例#11
0
    def get_results(self, request, term, page, context):
        start = (page - 1) * 10
        end = page * 10

        User = get_user_model()

        terms = term.strip().lower().split(' ')
        q = get_user_query_filter_for_search_terms(terms)

        user_qs = filter_active_users(
            User.objects.filter(
                id__in=CosinnusPortal.get_current().members).filter(q))

        count = user_qs.count()
        if count < start:
            raise Http404
        has_more = count > end

        users = user_qs.all()[start:end]
        #results = get_user_choices(users)
        results = get_user_select2_pills(users)

        return (NO_ERR_RESP, has_more, results)
示例#12
0
 def qs_func():
     return filter_portal_users(
         filter_active_users(get_user_model().objects.all()))
示例#13
0
 def index_queryset(self, using=None):
     qs = self.get_model().objects.all()
     qs = filter_active_users(qs, filter_on_user_profile_model=True)
     qs = qs.select_related('user').all()
     return qs
示例#14
0
 def filter_user_qs(self, user_qs, terms):
     q = get_user_query_filter_for_search_terms(terms)
     user_qs = filter_active_users(
         user_qs.filter(
             id__in=CosinnusPortal.get_current().members).filter(q))
     return user_qs
示例#15
0
 def get_queryset(self):
     include_uids = CosinnusPortal.get_current().members
     exclude_uids = self.group.members
     return filter_active_users(get_user_model().objects.filter(id__in=include_uids).exclude(id__in=exclude_uids))