Changeset 371 in main


Ignore:
Timestamp:
10/04/11 16:16:42 (8 years ago)
Author:
pcosquer
Message:

groups: add invitation

Location:
trunk/openPLM
Files:
8 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/openPLM/plmapp/controllers/group.py

    r355 r371  
    3030""" 
    3131 
     32import datetime 
    3233 
    3334import openPLM.plmapp.models as models 
     35from openPLM.plmapp.mail import send_mail 
     36from openPLM.plmapp.exceptions import PermissionError 
    3437from openPLM.plmapp.controllers.base import Controller, permission_required 
    3538 
     
    139142        Adds *user* to the group. 
    140143        """ 
     144        if not user.email: 
     145            raise ValueError("user's email is empty") 
     146        inv = models.Invitation.objects.create(group=self.object, owner=self._user, 
     147                guest=user, guest_asked=False) 
     148        ctx = { "group" : self.object, 
     149                "invitation" : inv, 
     150                } 
     151        subject = "[PLM] Invitation to join the group %s" % self.name  
     152        send_mail(subject, [user], ctx, "mails/invitation1") 
     153 
     154    def ask_to_join(self): 
     155        """ 
     156        Adds *user* to the group. 
     157        """ 
     158        if not self.owner.email: 
     159            raise ValueError("user's email is empty") 
     160        inv = models.Invitation.objects.create(group=self.object, owner=self.owner, 
     161                guest=self._user, guest_asked=True) 
     162        ctx = { "group" : self.object, 
     163                "invitation" : inv, 
     164                "guest" : self._user 
     165                } 
     166        subject = "[PLM] %s ask you to join the group %s" % (self._user, self.name)  
     167        send_mail(subject, [self.owner], ctx, "mails/invitation2") 
     168 
     169 
     170    def accept_invitation(self, invitation): 
     171        if invitation.state != models.Invitation.PENDING: 
     172            raise ValueError("Invalid invitation") 
     173        if invitation.guest_asked: 
     174            if self._user != invitation.owner: 
     175                raise PermissionError("You can not accept this invitation.") 
     176        else: 
     177            if self._user != invitation.guest: 
     178                raise PermissionError("You can not accept this invitation.") 
     179             
     180        invitation.state = models.Invitation.ACCEPTED 
     181        invitation.validation_time = datetime.datetime.now() 
     182 
     183        user = invitation.guest 
    141184        user.groups.add(self.object) 
    142         # TODO send a more relevant mail 
    143185        self._save_histo("User added", user.username, users=(user,)) 
    144186 
     187    def refuse_invitation(self, invitation): 
     188        if invitation.state != models.Invitation.PENDING: 
     189            raise ValueError("Invalid invitation") 
     190        if invitation.guest_asked: 
     191            if self._user != invitation.owner: 
     192                raise PermissionError("You can not refuse this invitation.") 
     193        else: 
     194            if self._user != invitation.guest: 
     195                raise PermissionError("You can not refuse this invitation.") 
     196        invitation.state = models.Invitation.REFUSED 
     197        invitation.validation_time = datetime.datetime.now() 
     198        # TODO mail 
     199 
  • trunk/openPLM/plmapp/forms.py

    r368 r371  
    451451                raise forms.ValidationError(error) 
    452452        return self.cleaned_data 
     453 
     454_inv_qset = m.Invitation.objects.filter(state=m.Invitation.PENDING) 
     455class InvitationForm(forms.Form): 
     456    invitation = forms.ModelChoiceField(queryset=_inv_qset, 
     457            required=True, widget=forms.HiddenInput()) 
     458 
     459 
  • trunk/openPLM/plmapp/models.py

    r363 r371  
    10131013    return list_of_choices 
    10141014 
     1015 
     1016class Invitation(models.Model): 
     1017    PENDING = "p" 
     1018    ACCEPTED = "a" 
     1019    REFUSED = "r" 
     1020    STATES = ((PENDING, "Pending"), 
     1021              (ACCEPTED, "Accepted"), 
     1022              (REFUSED, "Refused")) 
     1023    group = models.ForeignKey(GroupInfo) 
     1024    owner = models.ForeignKey(User, related_name="%(class)s_inv_owner") 
     1025    guest = models.ForeignKey(User, related_name="%(class)s_inv_guest") 
     1026    state = models.CharField(max_length=1, choices=STATES, default=PENDING) 
     1027    ctime = models.DateTimeField(_("date of creation"), default=datetime.datetime.today, 
     1028                                 auto_now_add=False) 
     1029    validation_time = models.DateTimeField(_("date of validation"), null=True) 
     1030    guest_asked = models.BooleanField(_("True if guest created the invitation")) 
     1031    token = models.CharField(max_length=155, primary_key=True, 
     1032            default=lambda:str(random.getrandbits(512))) 
     1033     
     1034     
    10151035# import_models should be the last function 
    10161036 
  • trunk/openPLM/plmapp/templatetags/plmapp_tags.py

    r369 r371  
    11from django import template 
    22from django.contrib.auth.models import User 
     3from openPLM.plmapp.controllers.user import UserController 
    34 
    45register = template.Library() 
     
    3132        return parent.can_add_child(child) 
    3233    elif action == "delegate": 
    33         return isinstance(child, User) 
     34        return isinstance(child, (User, UserController)) 
    3435  
    3536    return False 
  • trunk/openPLM/plmapp/views/main.py

    r370 r371  
    995995    ctx["user_formset"] = formset 
    996996    ctx['current_page'] = 'users'  
     997    ctx['in_group'] = bool(request.user.groups.filter(id=obj.id)) 
    997998    return r2r("groups/users.htm", ctx, request) 
    998999 
     
    10151016    ctx['current_page'] = 'users'  
    10161017    return r2r("groups/add_user.htm", ctx, request) 
     1018 
     1019@handle_errors 
     1020def group_ask_to_join(request, obj_ref): 
     1021    obj, ctx = get_generic_data(request, "Group", obj_ref) 
     1022    if request.method == "POST": 
     1023        obj.ask_to_join() 
     1024        return HttpResponseRedirect("..") 
     1025    else: 
     1026        form = forms.SelectUserForm() 
     1027    ctx["ask_form"] = "" 
     1028    ctx['current_page'] = 'users'  
     1029    ctx['in_group'] = bool(request.user.groups.filter(id=obj.id)) 
     1030    return r2r("groups/ask_to_join.htm", ctx, request) 
    10171031 
    10181032@handle_errors 
     
    10531067    return r2r("groups/objects.htm", ctx, request) 
    10541068 
     1069@handle_errors(undo="../../../users/") 
     1070def accept_invitation(request, obj_ref, token): 
     1071    token = long(token) 
     1072    obj, ctx = get_generic_data(request, "Group", obj_ref) 
     1073    inv = models.Invitation.objects.get(token=token) 
     1074    if request.method == "POST": 
     1075        form = forms.InvitationForm(request.POST) 
     1076        if form.is_valid() and inv == form.cleaned_data["invitation"]: 
     1077            obj.accept_invitation(inv) 
     1078            return HttpResponseRedirect("../../../users/") 
     1079    else: 
     1080        form = forms.InvitationForm(initial={"invitation" : inv}) 
     1081    ctx["invitation_form"] = form 
     1082    ctx['current_page'] = 'users' 
     1083    ctx["invitation"] = inv 
     1084    return r2r("groups/accept_invitation.htm", ctx, request) 
     1085 
     1086  
     1087@handle_errors(undo="../../../users/") 
     1088def refuse_invitation(request, obj_ref, token): 
     1089    token = long(token) 
     1090    obj, ctx = get_generic_data(request, "Group", obj_ref) 
     1091    inv = models.Invitation.objects.get(token=token) 
     1092    if request.method == "POST": 
     1093        form = forms.InvitationForm(request.POST) 
     1094        if form.is_valid() and inv == form.cleaned_data["invitation"]: 
     1095            obj.refuse_invitation(inv) 
     1096            return HttpResponseRedirect("../../../users/") 
     1097    else: 
     1098        form = forms.InvitationForm(initial={"invitation" : inv}) 
     1099    ctx["invitation_form"] = form 
     1100    ctx["invitation"] = inv 
     1101    ctx['current_page'] = 'users' 
     1102    return r2r("groups/refuse_invitation.htm", ctx, request) 
     1103 
     1104            
     1105 
  • trunk/openPLM/templates/groups/users.htm

    r349 r371  
    99        {{ user_formset.management_form }} 
    1010        {% if is_owner %} 
    11             <span class="ButtonLeft"> 
     11                <span class="ButtonLeft"> 
    1212                    <a class="Button" href="./add/">{% trans "Add another user" %}</a> 
    13             </span> 
     13                </span> 
    1414            {% if user_formset.forms %} 
    1515                <input type="submit" value="{% trans "Remove selected users" %}"/> 
     16            {% endif %} 
     17        {% else %} 
     18            {% if not in_group %} 
     19                <span class="ButtonLeft"> 
     20                    <a class="Button" href="./join/">{% trans "Ask to join this group" %}</a> 
     21                </span> 
    1622            {% endif %} 
    1723        {% endif %} 
  • trunk/openPLM/urls.py

    r362 r371  
    143143    (r'users/$', display_users), 
    144144    (r'users/add/$', group_add_user), 
     145    (r'users/join/$', group_ask_to_join), 
     146    (r'invitation/accept/(?P<token>\d+)/$', accept_invitation), 
     147    (r'invitation/refuse/(?P<token>\d+)/$', refuse_invitation), 
    145148    #(r'navigate/$', navigate, group_dict), 
    146149) 
Note: See TracChangeset for help on using the changeset viewer.