View and management commands for adding/removing user resource quota
authorSofia Papagiannaki <papagian@gmail.com>
Thu, 4 Oct 2012 09:42:15 +0000 (12:42 +0300)
committerSofia Papagiannaki <papagian@gmail.com>
Thu, 4 Oct 2012 09:42:15 +0000 (12:42 +0300)
Refs: #2793

snf-astakos-app/astakos/im/forms.py
snf-astakos-app/astakos/im/management/commands/user-update.py
snf-astakos-app/astakos/im/models.py
snf-astakos-app/astakos/im/templates/im/astakosuserquota_list.html
snf-astakos-app/astakos/im/views.py

index 5df37de..a37e768 100644 (file)
@@ -647,3 +647,9 @@ class MembersSortForm(forms.Form):
                                          ('date_joined', 'Status')
                                          ),
                                 required=False)
+
+class PickResourceForm(forms.Form):
+    resource = forms.ModelChoiceField(
+        queryset=Resource.objects.select_related().all()
+    )
+    resource.widget.attrs["onchange"]="this.form.submit()"
\ No newline at end of file
index b98bd4c..33bb2fd 100644 (file)
@@ -38,7 +38,8 @@ from django.core.management.base import BaseCommand, CommandError
 from django.core.exceptions import ValidationError
 from django.db.utils import IntegrityError
 
-from astakos.im.models import AstakosUser, AstakosGroup, Membership
+from astakos.im.models import (AstakosUser, AstakosGroup, Membership, Resource,
+                               AstakosUserQuota)
 from astakos.im.endpoints.aquarium.producer import report_user_credits_event
 from ._common import remove_user_permission, add_user_permission
 
@@ -47,7 +48,7 @@ class Command(BaseCommand):
     args = "<user ID>"
     help = "Modify a user's attributes"
 
-    option_list = BaseCommand.option_list + (
+    option_list = list(BaseCommand.option_list) + [
         make_option('--invitations',
                     dest='invitations',
                     metavar='NUM',
@@ -111,8 +112,15 @@ class Command(BaseCommand):
                     dest='refill',
                     default=False,
                     help="Refill user credits"),
-    )
-
+    ]
+    resources = Resource.objects.select_related().all()
+    append = option_list.append
+    for r in resources:
+        append(make_option('--%s-set-quota' % r,
+                    dest='%s-set-quota' % r,
+                    metavar='QUANTITY',
+                    help="Set resource quota"))
+    
     def handle(self, *args, **options):
         if len(args) != 1:
             raise CommandError("Please provide a user ID")
@@ -225,3 +233,16 @@ class Command(BaseCommand):
 
         if password:
             self.stdout.write('User\'s new password: %s\n' % password)
+        
+        for r in self.resources:
+            limit = options.get('%s-set-quota' % r)
+            if not limit:
+                continue
+            if not limit.isdigit():
+                raise CommandError('Invalid limit')
+            
+            q = AstakosUserQuota.objects
+            q, created = q.get_or_create(resource=r, user=user,
+                                         defaults={'uplimit': limit})
+            verb = 'set' if created else 'updated'
+            self.stdout.write('User\'s quota %s successfully\n' % verb)
\ No newline at end of file
index 1548144..e86aaa2 100644 (file)
@@ -297,7 +297,7 @@ class AstakosUser(User):
     def quota(self):
         d = defaultdict(int)
         for q in self.astakosuserquota_set.select_related().all():
-            d[q.resource.name] += q.uplimit
+            d[q.resource] += q.uplimit
         for m in self.membership_set.select_related().all():
             if not m.is_approved:
                 continue
@@ -306,6 +306,7 @@ class AstakosUser(User):
                 continue
             for r, uplimit in g.quota.iteritems():
                 d[r] += uplimit
+        
         # TODO set default for remaining
         return d
 
index fbb0fc2..3e5e83f 100644 (file)
@@ -5,39 +5,35 @@
 {% block page.body %}
 <div class="maincol {% block innerpage.class %}{% endblock %}">
     <div class="section">
-            {% for k, v in user.quota|items %}
-                <strong>{{k}}</strong>
-                <table class="zebra-striped id-sorted">
-<!-- 
-                    <thead>
-                      <tr>
-                        <th>Limit (Group)</th>
-                      </tr>
-                    </thead>
- -->
-                    <tbody>
-                    {% for m in user.membership_set.select_related.all %}
-                        {% if m.group.is_enabled %}
-                            {% with m.group.quota as quota %}
-                            {% if  quota %}
-                                {% for kk, vv in quota|items %}
-                                    {% if k == kk %}
-                                    <tr>
-                                        <td>{{ vv }} ({{m.group.name}})</td>
-                                    </tr>
-                                    {% endif %}
-                                {% endfor %}
-                            {% endif %}
-                            {% endwith %}
+        <form action="" method="post"
+                   class="withlabels">{% csrf_token %}
+                   {% include "im/form_render.html" %}
+           </form>
+           <table>
+           {% for q in object_list %}
+               {% if q.group.is_enabled %}
+                   <tr>
+                       <td>{{ q.uplimit }}</td><td>({{ q.group }})</td>
+                   </tr>
+               {% endif %}
+           {% endfor %}
+           {% if form.cleaned_data %}
+            {% with form.cleaned_data|lookup:'resource' as resource %}
+                {% if resource %}
+                    {% for q in user.astakosuserquota_set.all %}
+                        {% if q.resource == resource %}
+                        <tr>
+                            <td>{{ q.uplimit }}</td><td>(assigned to me)</td>
+                        </tr>
                         {% endif %}
                     {% endfor %}
-                                    <tr>
-                                        <td><strong>{{ v }}</strong></td>
-                                    </tr>
-                                    <tr/>
-                    </tbody>
-                </table>
-            {% endfor %}
+                        <tr>
+                            <td>{{ user.quota|lookup:resource }}</td><td>(total)</td>
+                        </tr>
+                {% endif %}
+            {% endwith %}
+        {% endif %}
+           </table>
     </div>
 </div>
 {% endblock %}
index c5cd73e..5f78142 100644 (file)
@@ -61,7 +61,7 @@ from django.core.xheaders import populate_xheaders
 
 from astakos.im.models import (
     AstakosUser, ApprovalTerms, AstakosGroup, Resource,
-    EmailChange, GroupKind, Membership)
+    EmailChange, GroupKind, Membership, AstakosGroupQuota)
 from astakos.im.activation_backends import get_backend, SimpleBackend
 from astakos.im.util import get_context, prepare_response, set_cookie, get_query
 from astakos.im.forms import (LoginForm, InvitationForm, ProfileForm,
@@ -70,7 +70,7 @@ from astakos.im.forms import (LoginForm, InvitationForm, ProfileForm,
                               AstakosGroupCreationForm, AstakosGroupSearchForm,
                               AstakosGroupUpdateForm, AddGroupMembersForm,
                               AstakosGroupSortForm, MembersSortForm,
-                              TimelineForm)
+                              TimelineForm, PickResourceForm)
 from astakos.im.functions import (send_feedback, SendMailError,
                                   invite as invite_func, logout as auth_logout,
                                   activate as activate_func,
@@ -1031,12 +1031,26 @@ def disapprove_member(request, membership):
 @signed_terms_required
 @login_required
 def resource_list(request):
-    return render_response(
-        template='im/astakosuserquota_list.html',
-        context_instance=get_context(request))
+    if request.method == 'POST':
+        form = PickResourceForm(request.POST)
+        if form.is_valid():
+            r = form.cleaned_data.get('resource')
+            if r:
+                groups = request.user.membership_set.only('group').filter(
+                    date_joined__isnull=False)
+                groups = [g.group_id for g in groups]
+                q = AstakosGroupQuota.objects.select_related().filter(
+                    resource=r, group__in=groups)
+    else:
+        form = PickResourceForm()
+        q = AstakosGroupQuota.objects.none()
+    return object_list(request, q,
+                       template_name='im/astakosuserquota_list.html',
+                       extra_context={'form': form})
 
 
 def group_create_list(request):
+    form = PickResourceForm()
     return render_response(
         template='im/astakosgroup_create_list.html',
         context_instance=get_context(request),)