blob: 790e684ea71bd28eb7fa097fe3844b1b6a49fcee [file] [log] [blame]
lombardofr099364f2018-06-12 11:21:02 +02001#
2# Copyright 2018 EveryUP Srl
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16from __future__ import unicode_literals
17from django.db import models
18from django.utils.translation import ugettext_lazy as _
19from django.contrib.auth.models import User, AbstractBaseUser, BaseUserManager, PermissionsMixin
20from django.utils import timezone
lombardofr99f922f2018-07-17 17:27:36 +020021
22from authosm.exceptions import OSMAuthException
23from lib.osm.osmclient.clientv2 import Client
24import utils
lombardofr099364f2018-06-12 11:21:02 +020025
26
27class OsmUserManager(BaseUserManager):
28 """Custom manager for OsmUser."""
29
30 def _create_user(self, username, password, is_staff, is_superuser, **extra_fields):
31 """Create and save a CustomUser with the given username and password. """
32 now = timezone.now()
33
34 if not username:
35 raise ValueError('The given username must be set')
36
37 is_active = extra_fields.pop("is_active", True)
38 user = self.model(username=username, is_staff=is_staff, is_active=is_active,
39 is_superuser=is_superuser, last_login=now,
40 date_joined=now, **extra_fields)
41 user.set_password(password)
42 user.save(using=self._db)
43 return user
44
45 """Create and save an OsmUser with the given username and password."""
46 def create_superuser(self, username, password, **extra_fields):
47 return self._create_user(username, password, True, True, is_admin=True,
48 **extra_fields)
49
50
51class AbstractOsmUser(AbstractBaseUser, PermissionsMixin):
52 """Abstract User with the same behaviour as Django's default User.
53
54
55 Inherits from both the AbstractBaseUser and PermissionMixin.
56
57 The following attributes are inherited from the superclasses:
58 * password
59 * last_login
60 * is_superuser
61
62 """
lombardofr99f922f2018-07-17 17:27:36 +020063 username = models.CharField(_('username'), primary_key=True, max_length=255, unique=True, db_index=True)
64
lombardofr099364f2018-06-12 11:21:02 +020065 is_admin = models.BooleanField(_('admin status'), default=False)
66 is_basic_user = models.BooleanField(_('basic_user status'), default=False)
lombardofr99f922f2018-07-17 17:27:36 +020067 current_project = models.CharField(_('project_id'), max_length=255)
68
69 psw = models.CharField(_('psw'), max_length=36)
70 token = models.CharField(_('token'), max_length=36)
71 project_id = models.CharField(_('project_id'), max_length=36)
72 token_expires = models.FloatField(_('token_expires'), max_length=36)
lombardofr099364f2018-06-12 11:21:02 +020073
74 objects = OsmUserManager()
75
76 USERNAME_FIELD = 'username'
77 REQUIRED_FIELDS = []
78
lombardofr99f922f2018-07-17 17:27:36 +020079 @property
80 def is_authenticated(self):
81 """Checks for a valid authentication."""
82 if self.token is not None and utils.is_token_valid({'expires': self.token_expires}):
83 return True
84 else:
85 return False
86
87 def get_token(self):
88 if self.is_authenticated:
89 return {'id': self.token, 'expires': self.token_expires, 'project_id': self.project_id}
90 return None
91
lombardofr835a0b72018-07-18 15:26:16 +020092 def get_projects(self):
93 client = Client()
94 result = client.get_user_info(self.get_token(), self.username)
95 if 'error' in result and result['error'] is True:
96 return []
97 else:
98 return result['data']['projects']
99
lombardofr99f922f2018-07-17 17:27:36 +0200100 def switch_project(self, project_id):
101 client = Client()
102 result = client.switch_project({'project_id': project_id, 'username': self.username, 'password': self.psw})
103 if 'error' in result and result['error'] is True:
104 raise OSMAuthException(result['data'])
105 else:
106 self.token = result['data']['id']
107 self.project_id = result['data']['project_id']
108 self.token_expires = result['data']['expires']
109 self.save()
110 return True
111 return False
112
lombardofr099364f2018-06-12 11:21:02 +0200113 class Meta:
114 verbose_name = _('custom user')
115 verbose_name_plural = _('custom users')
116 abstract = True
117
118
lombardofr099364f2018-06-12 11:21:02 +0200119class OsmUser(AbstractOsmUser):
120 """
121 Concrete class of AbstractCustomUser.
122
123 Use this if you don't need to extend CustomUser.
124
125 """
126
127 class Meta(AbstractOsmUser.Meta):
128 swappable = 'AUTH_USER_MODEL'
129