]> git.0d.be Git - panikdb.git/commitdiff
add export of members as vCard
authorFrédéric Péters <fpeters@0d.be>
Mon, 8 Feb 2021 15:28:21 +0000 (16:28 +0100)
committerFrédéric Péters <fpeters@0d.be>
Mon, 8 Feb 2021 15:28:21 +0000 (16:28 +0100)
debian/control
panikdb/aa/urls.py
panikdb/aa/views.py
panikdb/static/css/style.scss
panikdb/templates/aa/user_list.html

index 930802806857870253e34a35e48ba33d01f84b18..3e350a992e3bb3b0ce0e5c3f46e7967b4908ccff 100644 (file)
@@ -23,6 +23,7 @@ Depends: python3-django-ckeditor,
          python3-django-registration,
          python3-jwcrypto,
          python3-pysolr,
+         python3-vevent,
          ${python3:Depends}
 Description: Panik database management
  Backoffice for everything.
index be7c2211d55b9afafa60b90156aa01a553d82aea..c6985e1bcc11262ad81f937b4371970dc4389b40 100644 (file)
@@ -6,6 +6,7 @@ from . import views
 urlpatterns = [
     url(r'^members/$', views.members_list_view, name='members-list-view'),
     url(r'^members/new/$', views.member_new, name='member-new'),
+    url(r'^members/vcard/$', views.members_vcard, name='members-vcard'),
     url(r'^members/(?P<pk>\d+)/$', views.member_view, name='member-view'),
     url(r'^members/(?P<pk>\d+)/edit/$', views.member_edit, name='member-edit'),
     url(r'^members/(?P<pk>\d+)/emissions/$', views.member_emissions, name='member-emissions'),
index e78ceef25f535f1c80201e86f286439454b1c3d8..e54d7ef291750c138e6f10dd1c8db32e96c4f5a2 100644 (file)
@@ -1,7 +1,7 @@
 from django.contrib.auth.decorators import login_required
 from django.contrib.admin.views.decorators import staff_member_required
 from django.db.models import Q
-from django.http import HttpResponseRedirect
+from django.http import HttpResponse, HttpResponseRedirect
 from django.views.generic.base import TemplateView, RedirectView
 from django.views.generic.detail import DetailView
 from django.views.generic.edit import CreateView, FormView, UpdateView
@@ -9,6 +9,7 @@ from django.views.generic.list import ListView
 from django.core.urlresolvers import reverse_lazy
 from django.core.exceptions import PermissionDenied
 
+import vobject
 
 from .models import User
 from .forms import MemberEditForm, MemberCreateForm, MemberEmissionForm
@@ -63,6 +64,49 @@ class MembersListView(ListView):
 members_list_view = login_required(MembersListView.as_view())
 
 
+class MembersVCardView(MembersListView):
+    def get_queryset(self):
+        qs = super().get_queryset()
+        if not self.request.user.is_staff:
+            qs = qs.filter(share_contact_details=True)
+        qs = qs.exclude(email='')
+        return qs
+
+    def render_to_response(self, context, **response_kwargs):
+        members = []
+        for member in self.get_queryset():
+            card = vobject.vCard()
+            card.add('n')
+            card.n.value = vobject.vcard.Name(family=member.last_name, given=member.first_name)
+            card.add('fn')
+            card.fn.value = str(member)
+            card.add('email')
+            card.email.value = member.email
+            card.email.type_param = 'INTERNET'
+            card.add('note')
+            note_parts = []
+            if member.is_ca():
+                note_parts.append('CA')
+            if member.is_cp():
+                note_parts.append('CP')
+            note_parts.extend([str(x) for x in member.active_emissions()])
+            card.note.value = ', '.join(note_parts)
+            if member.phone:
+                card.add('tel')
+                card.tel.value = member.phone
+                card.tel.type_param = 'HOME'
+            if member.mobile:
+                card.add('tel')
+                card.tel.value = member.mobile
+                card.tel.type_param = 'CELL'
+            members.append(card.serialize())
+        content = ''.join(members)
+        return HttpResponse(content, content_type='text/vcard')
+
+
+members_vcard = login_required(MembersVCardView.as_view())
+
+
 class MemberView(DetailView):
     model = User
 
index bbf66530dfcf82f084d10b1a1e8bfd49bfca252a..ed34158210c2e874aa9d3953ce6bb9667e9c320e 100644 (file)
@@ -887,3 +887,11 @@ div.section > div > *:first-child {
                display: none;
        }
 }
+
+.members-pagination {
+       display: flex;
+       justify-content: space-between;
+       p {
+               margin: 4ex 1px;
+       }
+}
index 55bb760993cd5283ba88a2f493c7556de64b27e7..7f84160f4c228369d0c5a34b132b736a7d7d832d 100644 (file)
@@ -34,6 +34,9 @@
 {% endfor %}
 </table>
 
+<div class="members-pagination">
 {% include "gadjo/pagination.html" %}
+<p><a class="button" href="{% url 'members-vcard' %}?q={{ request.GET.q }}">{% trans "Export as vCard" %}</a></p>
+</div>
 
 {% endblock %}