diff --git a/hypha/apply/users/admin_views.py b/hypha/apply/users/admin_views.py index 170d501d5bcc250f45e7135f7581c6790dfa794e..1de29022ba4139d83b085604ecda6eae3cfee785 100644 --- a/hypha/apply/users/admin_views.py +++ b/hypha/apply/users/admin_views.py @@ -1,8 +1,13 @@ +import csv +import os + import django_filters +from django.conf import settings from django.contrib.auth import get_user_model from django.contrib.auth.models import Group from django.core.paginator import Paginator from django.db.models import Q +from django.http import HttpResponse from django.shortcuts import get_object_or_404 from django.template.response import TemplateResponse from django.utils.translation import gettext as _ @@ -22,6 +27,35 @@ add_user_perm = "{0}.add_{1}".format(AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME.l change_user_perm = "{0}.change_{1}".format(AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME.lower()) delete_user_perm = "{0}.delete_{1}".format(AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME.lower()) +def create_csv(users_list): + base_path=os.path.join(settings.PROJECT_DIR,'../media') + filename = 'users.csv' + with open(os.path.join(base_path+'/'+filename),'w+') as file: + fieldnames=['full_name','email','status','role'] + writer = csv.DictWriter(file, fieldnames=fieldnames) + writer.writeheader() + for user in users_list: + writer.writerow(user) + return base_path + '/' + filename + +def export(users): + users_list = [] + for user in users: + if user.is_superuser: + user.roles.insert(0,'Admin') + roles=','.join(user.roles) + user_data={ + 'full_name': user.full_name, + 'email':user.email, + 'status': 'Active' if user.is_active else 'Inactive', + 'role': roles + } + users_list.append(user_data) + filepath=create_csv(users_list) + with open(filepath, 'rb') as file: + response = HttpResponse(file.read(), content_type="text/csv") + response['Content-Disposition'] = 'inline; filename=' + os.path.basename(filepath) + return response class UserFilterSet(WagtailFilterSet): STATUS_CHOICES = ( @@ -104,6 +138,10 @@ def index(request, *args): filters = UserFilterSet(request.GET, queryset=users, request=request) users = filters.qs + if 'export' in request.GET: + file = export(users) + return file + if 'ordering' in request.GET: ordering = request.GET['ordering'] diff --git a/hypha/apply/users/templates/wagtailusers/users/results.html b/hypha/apply/users/templates/wagtailusers/users/results.html index c084dd4c8e10fac186fd9f84e4b7bc2cccbeed6b..d3530432f149962a15fb97fff2779e58d26746ee 100644 --- a/hypha/apply/users/templates/wagtailusers/users/results.html +++ b/hypha/apply/users/templates/wagtailusers/users/results.html @@ -46,6 +46,11 @@ {% endfor %} <button class="button button-longrunning" type="submit">{% icon name="spinner" %}{% trans 'Apply filters' %}</button> </form> + {%with request.get_full_path as path%} + <div class="users-list__export"> + <button class="button"><a href="{{path}}{% if '?' in path %}&{%else%}?{% endif %}export=true">{% trans 'Export Users' %}</a></button> + </div> + {%endwith%} </div> {% endif %} </div> diff --git a/hypha/static_src/src/sass/apply/wagtail_users_list.scss b/hypha/static_src/src/sass/apply/wagtail_users_list.scss index 0770fa211fe5b8ce7d78f281a461688ee3929cfa..62ec24d11d2d388e8b914e80df12d3e6cfd48864 100644 --- a/hypha/static_src/src/sass/apply/wagtail_users_list.scss +++ b/hypha/static_src/src/sass/apply/wagtail_users_list.scss @@ -24,4 +24,15 @@ margin-top: 20px; } } + + &__export { + button { + display: block; + margin-top: 20px; + } + + a { + color: $color--white; + } + } }