class Violation(_Model): employee = _related.ForeignKey( 'holding.Employee', on_delete=_deletion.SET_NULL, null=True, blank=False, # For admin panel? related_name="violations", ) when = _field.DateTimeField("Когда") title = _field.CharField( verbose_name="Название нарушения", null=False, blank=False, max_length=128, ) description = _field.TextField( verbose_name="Описание нарушения", null=True, blank=True, ) timezone = _timezone.TimeZoneField( verbose_name="Временная зона", null=True, blank=True, ) @property def employee_fullname(self): return "%s %s" % (self.employee.first_name, self.employee.last_name) employee_fullname.fget.short_description = "Сотрудник" def save(self, force_insert=False, force_update=False, using=None, update_fields=None): if self.timezone is None: self.timezone = self.employee.company.timezone return super(Violation, self).save(force_insert, force_update, using, update_fields) def __str__(self): return self.title class Meta: verbose_name = "Нарушение" verbose_name_plural = "Нарушения"
class Schedule(_Model): from django.db.models.fields import related as _related from django.db.models import deletion as _deletion from django.db.models import fields as _field from app.fields import timezone as _timezone employee = _related.ForeignKey( 'holding.Employee', on_delete=_deletion.SET_NULL, null=True, blank=False, # For admin panel? related_name="schedules", ) start = _field.DateTimeField("Начало") end = _field.DateTimeField("Конец") is_wanted = _field.NullBooleanField( verbose_name="Хочет работать", default=None, ) timezone = _timezone.TimeZoneField( verbose_name="Временная зона", null=True, blank=True, ) def save(self, force_insert=False, force_update=False, using=None, update_fields=None): if self.timezone is None: self.timezone = self.company.timezone return super(Schedule, self).save(force_insert, force_update, using, update_fields) @property def employee_fullname(self): return "%s %s" % (self.employee.first_name, self.employee.last_name) employee_fullname.fget.short_description = "Сотрудник" @property def company(self): return self.employee.company company.fget.short_description = "Компания" @property def company_name(self): return self.company.name company_name.fget.short_description = "Компания" def __str__(self): return "%s %s [%s]:(%s - %s)" % ( self.employee.first_name, self.employee.last_name, self.start.date(), self.start.time(), self.end.time()) class Meta: verbose_name = "График сотрудника" verbose_name_plural = "Графики сотрудников"
class User(_Abstract, _Model): from django.db.models import fields as _field from app.fields import timezone as _timezone email = _field.EmailField( verbose_name='E-mail', null=False, blank=False, unique=True, max_length=256, ) phone = _field.CharField( verbose_name='Телефон', max_length=30, null=False, blank=False, ) activation = _field.CharField( verbose_name='Код активации/восстановления пароля', max_length=255, null=True, editable=False, default=_activation_key) timezone = _timezone.TimeZoneField( verbose_name='Локальное время пользователя', default='UTC', null=False, blank=True, ) is_active = _field.BooleanField( verbose_name='Активирован', default= True, # Causes problems with super users if is not set to True. Handle base user active in views. ) is_banned = _field.BooleanField( verbose_name='Забанен', default=False, ) def new_activation(self): self.activation = _activation_key() return self.activation def check_activation(self, code): if self.activation is None or code is None or code == '': return False return self.activation == code def activate(self): """ Modificates user activation and save """ self.is_active = True self.activation = None self.save() def deactivate(self): """ Modificates user activation and save """ self.is_active = False self.activation = None self.save() def get_token(self): from entry.jwt import create_token return create_token(self) def __str__(self): return "%s %s (%s)" % (self.first_name, self.last_name, self.username) if (self.first_name or self.last_name) else ( "%s" % self.username) def reactivate(self): self.new_activation() self.save() # Mails part def mail_default(self, subject, template): from django.conf import settings _Mail(mail_from=settings.EMAIL_ADDRESSES.get('main'), mail_to=self.email, subject=subject, template=template, context={ 'user': self, }).start() def mail_activation(self): self.mail_default( template='user%sregister' % _os.sep, subject="Registration", ) def mail_activation_resend(self): self.reactivate() self.mail_default( template='user%sregister' % _os.sep, subject="Repeat registration mail", ) def mail_reset_password(self): self.reactivate() self.mail_default( template='user%snew_password' % _os.sep, subject="Password restoration", ) class Meta(_Abstract.Meta): swappable = 'AUTH_USER_MODEL' verbose_name = 'Пользователь' verbose_name_plural = 'Пользователи'
class Logbook(_Model): from django.db.models.fields import related as _related from django.db.models import deletion as _deletion from django.db.models import fields as _field from app.fields import timezone as _timezone employee = _related.ForeignKey( 'holding.Employee', on_delete=_deletion.SET_NULL, null=True, blank=False, # For admin panel? related_name="logbooks", ) start = _field.DateTimeField("Начало отрезка") end = _field.DateTimeField("Конец отрезка") activity = _field.PositiveSmallIntegerField( verbose_name="Активность", default=0, ) mood = _field.PositiveSmallIntegerField( verbose_name="Настроение", default=0, ) fatigue = _field.PositiveSmallIntegerField( verbose_name="Усталость", default=0, ) timezone = _timezone.TimeZoneField( verbose_name="Временная зона", null=True, blank=True, ) def save(self, force_insert=False, force_update=False, using=None, update_fields=None): if self.timezone is None: self.timezone = self.company.timezone return super(Logbook, self).save(force_insert, force_update, using, update_fields) @property def employee_fullname(self): return "%s %s" % (self.employee.first_name, self.employee.last_name) employee_fullname.fget.short_description = "Сотрудник" @property def company(self): return self.employee.company company.fget.short_description = "Компания" @property def company_name(self): return self.company.name company_name.fget.short_description = "Компания" def __str__(self): return "%s %s [%s]:(%s - %s)" % ( self.employee.first_name, self.employee.last_name, self.start.date(), self.start.time(), self.end.time(), ) class Meta: verbose_name = "Показатель сотрудника" verbose_name_plural = "Показатели сотрудников"
class Employee(_Model): from django.db.models import fields as _field from app.fields import timezone as _timezone from django.db.models.fields import related as _related from django.db.models import deletion as _deletion first_name = _field.CharField( max_length=200, verbose_name="Имя", ) last_name = _field.CharField( max_length=200, verbose_name="Фамилия", ) phone = _field.CharField( max_length=200, verbose_name="Телефон", null=True, blank=True, ) company = _related.ForeignKey( 'holding.Company', on_delete=_deletion.SET_NULL, verbose_name="Компания", null=True, blank=True, related_name="employees", ) is_manager = _field.BooleanField( verbose_name="Менеджер", default=False, ) is_fired = _field.BooleanField( verbose_name="Уволен", default=False, ) import uuid as _uuid auth_key = _field.UUIDField( verbose_name="Уникальный авторизационный ключ", editable=False, unique=True, null=True, blank=False, default=_uuid.uuid4, ) email = _field.EmailField( verbose_name="E-mail", null=True, blank=True, ) timezone = _timezone.TimeZoneField( verbose_name="Пояс", default="UTC", null=False, blank=True, ) invitation = _field.DateTimeField( verbose_name="Последнее приглашение", null=True, blank=True, ) is_invited = _field.BooleanField( verbose_name="Приглашён", null=False, default=False, ) is_active = _field.BooleanField( verbose_name="Активен", null=False, default=False, ) face_id = _field.UUIDField( verbose_name="Face ID", null=True, blank=True, ) user = _related.ForeignKey( 'entry.User', on_delete=_deletion.CASCADE, verbose_name="Физический пользователь", null=True, blank=True, ) department = _related.ForeignKey( 'holding.Department', on_delete=_deletion.SET_NULL, default=None, null=True, blank=True, related_name="employees", ) position = _related.ForeignKey( 'holding.Position', on_delete=_deletion.SET_NULL, default=None, null=True, blank=True, related_name="employees", ) def clear_face_id(self): self.face_id = None def new_face_id(self): self.face_id = self._uuid.uuid4() def new_invitation(self): from datetime import datetime old = self.invitation self.invitation = datetime.now() return old def activate(self): self.is_invited = True self.is_active = True self.auth_key = None def __str__(self): user = self.user ttl = {} if self.last_name and self.first_name: ttl['first_name'] = self.first_name ttl['last_name'] = self.last_name elif user: if user.last_name and user.first_name: ttl['first_name'] = user.first_name ttl['last_name'] = user.last_name ttl['username'] = user.username if ttl.get('first_name'): if ttl.get('username'): return "%(first_name)s %(last_name)s [%(username)s]" % ttl else: return "%(first_name)s %(last_name)s" % ttl elif ttl.get('username'): return "%(username)s" % ttl else: return "Employee №[%d]" % self.id @classmethod def create_from_user(cls, user, **kwargs): """ :type user: entry.models.User """ from factory.faker import faker fake = faker.Faker(locale='ru_RU') employee = cls( user=user, first_name=user.first_name if user.first_name else fake.first_name(), last_name=user.last_name if user.last_name else fake.last_name(), timezone=user.timezone, phone=user.phone, email=user.email, is_active=True, **kwargs ) employee.save() return employee def set_position(self, position, department=None): self.position = position if not department and not self.department: related = position.departments.first() if related: self.department = related.department elif department: self.department = department class Meta: verbose_name = "Сотрудник" verbose_name_plural = "Сотрудники" unique_together = (('user', 'company'),) def create_user(self, username=None): """ Creates user from employee, save it and send email if application not in debug mode :type username: str """ from django.conf import settings from entry.models import User if not self.auth_key and not username: raise AttributeError('No username provided or can\'t be get from auth') user = User( username=username if username else self.auth_key, first_name=self.first_name, last_name=self.last_name, email=self.email, phone=self.phone, timezone=self.timezone, ) user.save() self.user = user if user.email and not settings.DEBUG: user.mail_activation() if settings.DEBUG: user.activate() self.activate() return user
class Company(_Model): from app.fields import timezone as _timezone name = _field.CharField( verbose_name='Название компании', max_length=255, null=False, ) description = _field.TextField( verbose_name='Описание компании', max_length=4000, null=True, blank=True, ) address = _field.CharField( verbose_name='Адрес компании', max_length=512, null=True, blank=True, ) phone = _field.CharField( verbose_name='Телефон', max_length=32, null=True, blank=True, ) email = _field.EmailField( verbose_name='Почтовый ящик', max_length=255, null=False, ) owner = _related.ForeignKey( 'holding.Employee', # Changed company owner from user to employee because of the system flow verbose_name='Владелец', on_delete=_deletion.DO_NOTHING, null=False, related_name='owner', ) discount = _related.ForeignKey( to='pay.Discount', on_delete=_deletion.SET_NULL, null=True, blank=True, ) timezone = _timezone.TimeZoneField( verbose_name='Локальное время компании', default='UTC', null=False, blank=True, ) def __str__(self): return self.name @property def last_payment(self): from pay.models import Payment return Payment.objects.filter(details__company=self).last() @property def rate(self): return self.last_payment.details.rate if self.last_payment else None rate.fget.short_description = u'Тариф' @property def time_left(self): return self.last_payment.time_left if self.last_payment else -1 time_left.fget.short_description = u"Оплаченное время" @property def employee_amount(self): return self.employees.count() employee_amount.fget.short_description = u"Сотрудников" @property def departments_amount(self): return self.departments.count() departments_amount.fget.short_description = u"Отделов" def save(self, force_insert=False, force_update=False, using=None, update_fields=None): creation = True if self.id: creation = False super(Company, self).save(force_insert, force_update, using, update_fields) self.owner.company = self self.owner.save() if creation: CompanyCreator(creator=self.owner, company=self).save() class Meta: verbose_name = "Компания" verbose_name_plural = "Компании"
class Camera(_Model): from django.db.models.fields import related as _related from django.db.models import deletion as _deletion from django.db.models import fields as _field from app.fields import timezone as _timezone name = _field.CharField( verbose_name="Название", max_length=128, null=False, blank=False, ) ip_address = _field.GenericIPAddressField( verbose_name="IP адрес", max_length=64, ) login = _field.CharField( verbose_name="Логин", max_length=256, null=False, blank=False, ) password = _field.CharField( verbose_name="Пароль", max_length=256, null=False, blank=True, default="", ) is_active = _field.BooleanField( verbose_name="Активна", null=False, blank=False, default=True, ) company = _related.ForeignKey( 'holding.Company', on_delete=_deletion.CASCADE, null=False, blank=False, related_name="cameras", ) zone = _related.ForeignKey( 'cam.Zone', on_delete=_deletion.SET_NULL, null=True, blank=True, related_name="cameras", ) timezone = _timezone.TimeZoneField( "Временная зона", null=True, blank=True, ) def __str__(self): return self.name class Meta: verbose_name = "Камера" verbose_name_plural = "Камеры"