add admin view to manually activate a user
authorStefan Kögl <stefan@skoegl.net>
Sun, 26 May 2013 09:40:12 +0000 (26 11:40 +0200)
committerStefan Kögl <stefan@skoegl.net>
Sun, 26 May 2013 09:40:12 +0000 (26 11:40 +0200)
mygpo/admin/templates/admin/activate-user.html [new file with mode: 0644]
mygpo/admin/templates/admin/overview.html
mygpo/admin/urls.py
mygpo/admin/views.py
mygpo/db/couchdb/user.py

diff --git a/mygpo/admin/templates/admin/activate-user.html b/mygpo/admin/templates/admin/activate-user.html
new file mode 100644 (file)
index 0000000..792df1f
--- /dev/null
@@ -0,0 +1,41 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% load podcasts %}
+
+{% load menu %}
+{% block mainmenu %}{{ "/admin/"|main_menu }}{% endblock %}
+{% block sectionmenu %}{{ "/admin/"|section_menu:"Admin" }}{% endblock %}
+
+{% block title %}{% trans "Activate User" %}{% endblock %}
+
+{% block header %}
+ <h1>{% trans "Activate User" %}</h1>
+{% endblock %}
+
+{% block content %}
+ <form class="form-horizontal" method="post" action="{% url "admin-activate-user" %}">
+  {% csrf_token %}
+
+  <div class="control-group">
+   <label class="control-label" for="username">{% trans "Username" %}</label>
+   <div class="controls">
+    <input name="username" type="text" id="username" placeholder="Username">
+   </div>
+  </div>
+
+  <div class="control-group">
+   <label class="control-label" for="email">{% trans "Email" %}</label>
+   <div class="controls">
+    <input name="email" type="text" id="email" placeholder="Email">
+   </div>
+  </div>
+
+  <div class="control-group">
+   <div class="controls">
+    <button type="submit" class="btn">{% trans "Activate" %}</button>
+   </div>
+  </div>
+ </form>
+
+{% endblock %}
+
index 3d0eeb2..0ee08c6 100644 (file)
@@ -20,6 +20,7 @@
   <li><i class="icon-bar-chart"></i> <a href="{% url "useragents" %}">{% trans "User-Agent Stats" %}</a></li>
   <li><i class="icon-bar-chart"></i> <a href="{% url "admin-filetypes" %}">{% trans "File Type Stats" %}</a></li>
   <li><i class="icon-signal"></i> <a href="{% url "stats" %}">{% trans "General Stats" %}</a> (<a href="{% url "stats-json" %}">{% trans "JSON" %}</a>)</li>
+  <li><i class="icon-certificate"></i> <a href="{% url "admin-activate-user" %}">{% trans "Activate User" %}</a></li>
  </ul>
 
 {% endblock %}
index ff475cb..13e7da9 100644 (file)
@@ -3,7 +3,7 @@ from django.conf.urls import *
 from mygpo.admin.views import Overview, MergeSelect, MergeVerify, \
          MergeProcess, MergeStatus, ClientStatsView, ClientStatsJsonView, \
          UserAgentStatsView, StatsView, StatsJsonView, HostInfo, \
-         FiletypeStatsView
+         FiletypeStatsView, ActivateUserView
 
 urlpatterns = patterns('mygpo.admin.views',
  url(r'^$',              Overview.as_view(),     name='admin-overview'),
@@ -26,4 +26,8 @@ urlpatterns = patterns('mygpo.admin.views',
  url(r'^filetypes/$',
      FiletypeStatsView.as_view(),
      name='admin-filetypes'),
+
+ url(r'^activate-user/$',
+     ActivateUserView.as_view(),
+     name='admin-activate-user'),
 )
index 94b0db0..e4af3ab 100644 (file)
@@ -24,6 +24,7 @@ from mygpo.utils import get_git_head
 from mygpo.api.httpresponse import JsonResponse
 from mygpo.cel import celery
 from mygpo.db.couchdb import get_main_database
+from mygpo.db.couchdb.user import activate_user
 from mygpo.db.couchdb.episode import episode_count, filetype_stats
 from mygpo.db.couchdb.podcast import podcast_count, podcast_for_url
 
@@ -298,3 +299,40 @@ class FiletypeStatsView(AdminView):
             'max_num': max_num,
             'stats': stats.most_common(),
         })
+
+
+class ActivateUserView(AdminView):
+    """ Lets admins manually activate users """
+
+    template_name = 'admin/activate-user.html'
+
+    def get(self, request):
+        return self.render_to_response({})
+
+    def post(self, request):
+
+        username = request.POST.get('username')
+        email = request.POST.get('email')
+
+        if not (username or email):
+            messages.error(request,
+                           _('Provide either username or email address'))
+            return HttpResponseRedirect(reverse('admin-activate-user'))
+
+        user = None
+
+        if username:
+            user = User.get_user(username, is_active=None)
+
+        if email and not user:
+            user = User.get_user_by_email(email, is_active=None)
+
+        if not user:
+            messages.error(request, _('No user found'))
+            return HttpResponseRedirect(reverse('admin-activate-user'))
+
+        activate_user(user)
+        messages.success(request,
+                         _('User {username} ({email}) activated'.format(
+                            username=user.username, email=user.email)))
+        return HttpResponseRedirect(reverse('admin-activate-user'))
index d2cf726..74b349d 100644 (file)
@@ -271,3 +271,11 @@ def get_user_by_id(user_id):
         return User.get(user_id)
     except ResourceNotFound:
         return None
+
+
+@repeat_on_conflict(['user'])
+def activate_user(user):
+    """ activates a user so that he is able to login """
+    user.is_active = True
+    user.activation_key = None
+    user.save()