Exemple #1
0
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 = "Нарушения"
Exemple #2
0
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 = "Графики сотрудников"
Exemple #3
0
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 = 'Пользователи'
Exemple #4
0
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 = "Показатели сотрудников"
Exemple #5
0
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
Exemple #6
0
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 = "Компании"
Exemple #7
0
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 = "Камеры"