Projet

Général

Profil

« Précédent | Suivant » 

Révision 7ab17a37

Ajouté par Josué Kouka il y a plus de 8 ans

handle user association the right way (#9527)

Voir les différences:

mandayejs/mandaye/forms.py
13 13
#
14 14
# You should have received a copy of the GNU Affero General Public License
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
from __future__ import absolute_import
16 17

  
17 18
from django import forms
19
from django.conf import settings
18 20

  
21
from mandayejs.mandaye.models import UserCredentials
19 22

  
20 23
class FormFactory(forms.Form):
21 24
    def __init__(self, *args, **kwargs): 
22
        fields = kwargs.pop('locators', None)
23 25
        super(FormFactory, self).__init__(*args, **kwargs)
24
        
26
        fields = getattr(settings, 'SITE_LOCATORS', [])
25 27
        if fields : 
26 28
            for field in fields :
27 29
                if field['kind'] == 'string':
......
42 44
                            help_text=field['help']
43 45
                    )
44 46

  
45
    def is_valid(self,):
46
        is_valid = super(FormFactory, self).is_valid()
47
        if not is_valid:
48
            return is_valid
49

  
50
        if self.data == {}:
51
            return False
52

  
53
        return is_valid
54

  
mandayejs/mandaye/migrations/0007_auto_20160106_1746.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4
from django.db import models, migrations
5

  
6

  
7
class Migration(migrations.Migration):
8

  
9
    dependencies = [
10
        ('mandaye', '0006_usercredentials_linked'),
11
    ]
12

  
13
    operations = [
14
        migrations.AlterField(
15
            model_name='usercredentials',
16
            name='linked',
17
            field=models.BooleanField(default=False, verbose_name='associated'),
18
            preserve_default=True,
19
        ),
20
    ]
mandayejs/mandaye/models.py
23 23
class UserCredentials(models.Model):
24 24
    user = models.ForeignKey('auth.User')
25 25
    locators = JSONField(_('locators'), default={}, blank=True) 
26
    linked = models.BooleanField(_('associated'), default=True, blank=True)
26
    linked = models.BooleanField(_('associated'), default=False, blank=True)
27 27

  
28 28
    class Meta:
29 29
        unique_together = ('user',)
......
34 34
            or self.user.username
35 35

  
36 36
    def to_login_info(self):
37
        return {'#'+k : v for k,v in self.locators.items() if k != 'csrfmiddlewaretoken' }
37
        return {'#'+k : v for k,v in self.locators.items() }
38 38

  
mandayejs/mandaye/views.py
25 25
from django.conf import settings
26 26
from django.contrib.auth import views as auth_views
27 27
from django.contrib.auth import logout as auth_logout
28
from django.contrib.auth import get_user_model
28
from django.contrib.auth.models import User
29 29
from django.contrib.auth.decorators import login_required
30 30
from django.contrib import messages
31 31
from django.forms import PasswordInput
......
69 69
        """Check if user account is associated
70 70
        """
71 71
        try:
72
            User = get_user_model()
73 72
            user = User.objects.get(username=self.request.user.username)
74 73
            return user.usercredentials_set.get().linked
75 74
        except (User.DoesNotExist, UserCredentials.DoesNotExist) as e:
......
81 80
@login_required
82 81
def post_login(request, *args, **kwargs):
83 82
    try:
84
        user = get_user_model().objects.get(username=request.user.username)
83
        user = User.objects.get(username=request.user.username)
85 84
        logger.debug(user)
86 85
        credentials = UserCredentials.objects.get(
87
                user=user,
88
                linked=True)
86
                user=user)
89 87
        logger.debug(credentials)
90 88
    except (UserCredentials.DoesNotExist,):
91 89
        return HttpResponseRedirect(resolve_url('associate'))
......
97 95
@login_required
98 96
@csrf_exempt
99 97
def associate(request, *args, **kwargs):
100
    if request.POST:
101
        credentials, created = UserCredentials.objects.get_or_create(user=request.user)
102
        credentials.locators = request.POST
103
        credentials.linked = True
104
        credentials.save()
105
        form = FormFactory(request.POST, auto_id=True, locators=settings.SITE_LOCATORS)
106
    else:
107
        form = FormFactory(auto_id=True, locators=settings.SITE_LOCATORS)
108
    if not form.is_valid():
109
        site_static_root = getattr(settings, 'SITE_STATIC_ROOT_PATH', '')
110
        associate_static = getattr(settings, 'SITE_ASSOCIATE_STATIC',
111
                                   {'css':'', 'js':''})
112

  
113
        response = render(request, 'mandaye/associate.html', {
114
                    'form': form,
115
                    'associate_js': os.path.join(site_static_root, associate_static['js']),
116
                    'associate_css': os.path.join(site_static_root, associate_static['css'])
117
                })
118
        return response
98
    if request.method == 'POST':
99

  
100
        form = FormFactory(request.POST)
101
        if form.is_valid():
102
            credentials, created = UserCredentials.objects.get_or_create(user=request.user)
103
            credentials.locators = form.cleaned_data
104
            credentials.linked = False
105
            credentials.save()        
106

  
107
            return HttpResponseRedirect(resolve_url('post-login'))
108
    else :
109
        form = FormFactory()
110

  
111
    site_static_root = getattr(settings, 'SITE_STATIC_ROOT_PATH', '')
112
    associate_static = getattr(settings, 'SITE_ASSOCIATE_STATIC',
113
                           {'css':'', 'js':''})
114

  
115
    response = render(request, 'mandaye/associate.html', {
116
        'form': form,
117
        'associate_js': os.path.join(site_static_root, associate_static['js']),
118
        'associate_css': os.path.join(site_static_root, associate_static['css'])        
119
    })
120
    return response
119 121

  
120
    return HttpResponseRedirect(resolve_url('post-login'))
121 122

  
122 123
@login_required
123 124
def dissociate(request, *args, **kwargs):
124 125
    try:
125 126
        c_user = UserCredentials.objects.get(
126 127
                user__username=request.user.username)
127
        c_user.linked = False
128
        c_user.save()
128
        c_user.delete()
129 129
        logger.debug("{} dissacioted".format(c_user.user.username))
130 130
        response = HttpResponseRedirect('/')
131 131
        for cookie_key in getattr(settings, 'SITE_AUTH_COOKIE_KEYS', []):
......
137 137

  
138 138
@login_required
139 139
def post_login_do(request, *args, **kwargs):
140
    credentials = get_object_or_404(UserCredentials, user=request.user)
140
    user = User.objects.get(username=request.user.username)
141
    try:
142
        credentials = user.usercredentials_set.get()
143
    except (UserCredentials.DoesNotExist,):
144
        return HttpResponseRedirect(resolve_url('associate'))
145

  
141 146
    site_static_root = os.path.join(getattr(settings, 'STATIC_ROOT'), getattr(settings, 'SITE_STATIC_ROOT_PATH', ''))
142 147
    site_auth_checker = getattr(settings, 'SITE_AUTH_CHECKER', '')
143 148
    login_info = {
......
150 155
    logger.debug(login_info)
151 156
    result = exec_phantom(login_info)
152 157
    logger.debug(result)
158

  
153 159
    if result.get('result') != 'ok':
154 160
        logger.debug('authentication failed')
155
        User = get_user_model()
156
        user = User.objects.get(username=request.user.username)
157
        c_user = user.usercredentials_set.get()
158
        c_user.linked = False
159
        c_user.save()
160 161
        logger.debug("redirecting to {}".format(resolve_url('associate')))
162
        credentials.delete()
161 163
        messages.error(request, _('wrong user credentials'))
162 164
        url = resolve_url('associate')
163 165
    else:
166
        credentials.linked = True
167
        credentials.save()
164 168
        url = getattr(settings, 'SITE_HOME_PATH', '/')
165 169

  
166 170
    template = Template('<script type="text/javascript">\

Formats disponibles : Unified diff