Advertisement
Guest User

Untitled

a guest
Nov 24th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 17.04 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. from django.db import models
  3. from django.utils.translation import ugettext_lazy as _
  4. from utils.mixins.base import BaseMixin
  5. from rh.models import Usuario
  6. from django.core.exceptions import ValidationError
  7. import math
  8. import sys
  9.  
  10. # Create your models here.
  11. class ConfigSala(BaseMixin):
  12.     class Meta:
  13.         verbose_name=u'Configuração da Sala'
  14.         verbose_name_plural=u'Configurações da Sala'
  15.         #abstract = True
  16.     #usuario = models.ForeignKey(Usuario, related_name='usuario_sala')
  17.     descricao = models.CharField(default=u'Configuração das Salas H1', max_length=100)
  18.     #2GB de dados
  19.     limite_dados = models.CharField(null=True, default='2149580800', max_length=20)
  20.     #100MB de Mensagem
  21.     limite_mensagem = models.CharField(null=True, default='104857600', max_length=20)
  22.     limite_usuario = models.IntegerField(default=2)    
  23.     limite_maximo_unitario = models.CharField(null=True, default='104857600', max_length=20) #100 MB
  24.  
  25.     def __unicode__(self):
  26.         return self.descricao
  27.  
  28.     #--- Definição Singleton ---#
  29.  
  30.     def save(self, *args, **kwargs):
  31.         #self.definir_capacidade_dados()
  32.         #self.definir_capacidade_mensagem()
  33.         #self.definir_capacidade_usuarios()
  34.  
  35.         self.__class__.objects.exclude(id=self.id).delete()
  36.         super(ConfigSala, self).save(*args, **kwargs)
  37.  
  38.     @classmethod
  39.     def load(cls):
  40.         try:
  41.             return cls.objects.get()
  42.         except cls.DoesNotExist:
  43.             return cls()    
  44.     #---  ---#
  45.  
  46.     #Nao usado - pode ser implementado futuramente
  47.  
  48.     @staticmethod
  49.     def definir_capacidade_dados():
  50.         self = ConfigSala.objects.get()
  51.         capacidade = self.limite_dados
  52.         try:
  53.             #todas_salas = Salas.objects.filter(usuarios__id__exact=self.usuario)
  54.             todas_salas = Sala.objects.all()
  55.             if not todas_salas:
  56.                 raise ValidationError(u"Não possivel alterar a capacidade maxima de dados das salas")  
  57.             else:      
  58.                 for sala in todas_salas:
  59.                     sala.limite_dados = str(capacidade)
  60.                     sala.save()    
  61.         except Exception, e:
  62.             raise ValidationError(u"Não possivel alterar a capacidade maxima de dados das salas")  
  63.  
  64.     @staticmethod
  65.     def definir_capacidade_mensagem():
  66.         self = ConfigSala.objects.get()
  67.         capacidade = self.limite_mensagem
  68.         try:
  69.             #todas_salas = Salas.objects.filter(usuarios__id__exact=self.usuario)
  70.             todas_salas = Sala.objects.all()
  71.             if not todas_salas:
  72.                 raise ValidationError(u"Não possivel alterar a capacidade maxima de mensagem das salas")  
  73.             else:      
  74.                 for sala in todas_salas:
  75.                     sala.limite_mensagem = str(capacidade)
  76.                     sala.save()    
  77.         except Exception, e:
  78.             raise ValidationError(u"Não possivel alterar a capacidade maxima de mensagem das salas")
  79.    
  80.     @staticmethod
  81.     def definir_capacidade_usuarios():
  82.         self = ConfigSala.objects.get()
  83.         capacidade = self.limite_usuario
  84.         try:
  85.             #todas_salas = Salas.objects.filter(usuarios__id__exact=self.usuario)
  86.             todas_salas = Sala.objects.all()
  87.             if not todas_salas:
  88.                 raise ValidationError(u"Não possivel alterar a capacidade maxima de usuarios das salas")  
  89.             else:      
  90.                 for sala in todas_salas:
  91.                     sala.limite_usuario = str(capacidade)
  92.                     sala.save()    
  93.         except Exception, e:
  94.             raise ValidationError(u"Não possivel alterar a capacidade maxima de usuarios das salas")
  95.  
  96.     @staticmethod
  97.     def definir_limite_maximo_unitario():
  98.         self = ConfigSala.objects.get()
  99.         capacidade = self.limite_usuario
  100.         try:
  101.             #todas_salas = Salas.objects.filter(usuarios__id__exact=self.usuario)
  102.             todas_salas = Sala.objects.all()
  103.             if not todas_salas:                
  104.                 raise ValidationError(u"Não possivel alterar a capacidade maxima de um anexo unitario")  
  105.             else:                      
  106.                 for sala in todas_salas:
  107.                     sala.limite_maximo_unitario = str(capacidade)
  108.                     sala.save()    
  109.         except Exception, e:            
  110.             raise ValidationError(u"Não possivel alterar a capacidade maxima de um anexo unitario")
  111.  
  112. class Sala(BaseMixin):
  113.     class Meta:
  114.         verbose_name = 'Sala'
  115.         verbose_name_plural = 'Salas'
  116.         #unique_together = ('tutor','aluno')
  117.     descricao = models.CharField(max_length=50, verbose_name=u'Nome da Sala')
  118.     usuarios = models.ManyToManyField(Usuario, related_name='chat_sala')
  119.     limite_dados = models.CharField(null=True, default='1000000000', max_length=20)
  120.     total_dados = models.CharField(null=True, default=0, max_length=20)
  121.     limite_mensagem = models.CharField(null=True, default='1000000000', max_length=20)
  122.     total_mensagem = models.CharField(null=True, default=0, max_length=20)
  123.     limite_usuario = models.IntegerField(default=2)  
  124.     limite_maximo_unitario = models.CharField(null=True, default='104857600', max_length=20) #100 MB      
  125.  
  126.     @staticmethod
  127.     def converte_tipos(numero_bytes):
  128.         total_dados = int(numero_bytes) / 1024
  129.         if (total_dados == 0):
  130.             if (numero_bytes):
  131.                 return '{0} B'.format(numero_bytes)
  132.             else:
  133.                 return '0 B'
  134.         sigla = ("KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
  135.         i = int(math.floor(math.log(total_dados,1024)))
  136.         p = math.pow(1024,i)
  137.         s = round(total_dados/p,2)
  138.         return '%s %s' % (s,sigla[i])    
  139.  
  140.     @staticmethod
  141.     def total_geral_consumido_formatado():        
  142.         salas = Sala.objects.all()
  143.         total_anexo = 0
  144.         if salas:
  145.             for sala in salas:
  146.                 total_anexo = total_anexo + int(sala.total_dados) + int(sala.total_mensagem)
  147.             return Sala.converte_tipos(str(total_anexo))
  148.         else:
  149.             return "0 B"  
  150.  
  151.     @staticmethod
  152.     def total_geral_consumido_bytes():        
  153.         salas = Sala.objects.all()
  154.         total_anexo = 0
  155.         if salas:
  156.             for sala in salas:
  157.                 total_anexo = total_anexo + int(sala.total_dados) + int(sala.total_mensagem)
  158.             return total_anexo
  159.         else:
  160.             return "0"
  161.  
  162.     @staticmethod
  163.     def total_geral_anexo_consumido_formatado():        
  164.         salas = Sala.objects.all()
  165.         total_anexo = 0
  166.         if salas:
  167.             for sala in salas:
  168.                 total_anexo = total_anexo + int(sala.total_dados)
  169.             return Sala.converte_tipos(str(total_anexo))
  170.         else:
  171.             return "0 B"
  172.  
  173.     @staticmethod
  174.     def total_geral_anexo_consumido_bytes():        
  175.         salas = Sala.objects.all()
  176.         total_anexo = 0
  177.         if salas:
  178.             for sala in salas:
  179.                 total_anexo = total_anexo + int(sala.total_dados)
  180.             return total_anexo
  181.         else:
  182.             return "0"        
  183.  
  184.     @staticmethod
  185.     def total_geral_mensagem_consumido_formatado():        
  186.         salas = Sala.objects.all()
  187.         total_mensagem = 0
  188.         if salas:
  189.             for sala in salas:
  190.                 total_mensagem = total_mensagem + int(sala.total_mensagem)
  191.             return Sala.converte_tipos(str(total_mensagem))
  192.         else:
  193.             return "0 B"
  194.  
  195.     @staticmethod
  196.     def total_geral_mensagem_consumido_bytes():        
  197.         salas = Sala.objects.all()
  198.         total_mensagem = 0
  199.         if salas:
  200.             for sala in salas:
  201.                 total_mensagem = total_mensagem + int(sala.total_mensagem)
  202.             return total_mensagem
  203.         else:
  204.             return "0"        
  205.  
  206.     @property    
  207.     def capacidade_atual_mensagem(self):
  208.         return Sala.converte_tipos(self.total_mensagem)
  209.  
  210.     @property    
  211.     def capacidade_maxima_mensagem(self):        
  212.         return Sala.converte_tipos(self.limite_mensagem)
  213.  
  214.     @property    
  215.     def capacidade_atual_anexo(self):        
  216.         return Sala.converte_tipos(self.total_dados)
  217.  
  218.     @property    
  219.     def capacidade_maxima_anexo(self):        
  220.         return Sala.converte_tipos(self.limite_dados)
  221.  
  222.     @property
  223.     def capacidade_maxima_sala(self):
  224.         total = int(self.limite_dados) + int(self.limite_mensagem)
  225.         return Sala.converte_tipos(str(total))
  226.  
  227.     @property
  228.     def capacidade_atual_sala(self):
  229.         total = int(self.total_dados) + int(self.total_mensagem)
  230.         return Sala.converte_tipos(str(total))
  231.  
  232.     def __unicode__(self):      
  233.         #return "{0}-{1}-{2}".format(self.tutor.first_name, self.aluno.first_name, self.id)
  234.         #return "%04d%04d%04d" % (self.tutor.id, self.aluno.id, self.id)
  235.         return self.descricao
  236.     '''
  237.    def save(self, *args, **kwargs):                
  238.        if not self.descricao:
  239.            self.descricao = "Sala do Tutor: {0} para aluno: {1}".format(self.tutor.first_name, self.aluno.first_name)
  240.        super(Sala, self).save(*args, **kwargs)
  241.    '''    
  242.     '''
  243.    def pode_inserir_usuario(self):
  244.        if self.usuarios.all().count() < self.limite_usuario:
  245.            return True
  246.        else:
  247.            return False
  248.  
  249.    def inserir_usuario(self):
  250.        if self.pode_inserir_usuario():
  251.            for usuario in self.usuarios.all():
  252.                self.usuarios.add(usuario)
  253.        else:
  254.            raise ValidationError(u"Sala atingiu o numero máximo de usuários")
  255.    '''
  256.     '''
  257.    def save(self, *args, **kwargs):
  258.        #Como o dado é um singleton não há necessidade de filtro
  259.        
  260.        if self.id:
  261.            self.inserir_usuario()
  262.        super(Sala, self).save(*args, **kwargs)
  263.    '''
  264. class Anexo(BaseMixin):
  265.     class Meta:
  266.         verbose_name = 'Anexo'
  267.         verbose_name_plural = 'Anexos'
  268.     descricao = models.TextField(max_length=100)
  269.     anexo = models.FileField(upload_to='uploads/anexo/file/')
  270.     sala = models.ForeignKey(Sala,related_name='anexo_sala')
  271.     usuario = models.ForeignKey(Usuario, related_name='anexo_usuario')
  272.  
  273.     def __unicode__(self):
  274.         return "Anexo de {0}".format(self.usuario)
  275.  
  276.     def get_absolute_url(self):
  277.         return '%d'%self.id
  278.  
  279.     def limite_anexo_unitario(self):                        
  280.         if self.anexo:            
  281.             if int(self.anexo.size) > int(self.sala.limite_maximo_unitario): #100mb                
  282.                 return True
  283.             else:                
  284.                 return False        
  285.    
  286.     def atingiu_capacidade_maxima_anexo(self):
  287.         if self.anexo:            
  288.             atual = int(self.sala.total_dados) + self.anexo.size
  289.             limite_dados = int(self.sala.limite_dados)
  290.             if self.sala.limite_dados:
  291.                 metade = 100 * atual/int(self.sala.limite_dados)
  292.                 '''
  293.                if metade >= 50:
  294.                    #Implementar o envio de email para o usuario
  295.                    pass
  296.                '''
  297.             if atual > limite_dados:
  298.                 return True
  299.             else:
  300.                 return False
  301.         else:
  302.             return False
  303.  
  304.     def save(self, *args, **kwargs):      
  305.         print '1'  
  306.         print self.limite_anexo_unitario()
  307.         print self.atingiu_capacidade_maxima_anexo()
  308.         if self.limite_anexo_unitario():
  309.             print '2'
  310.             raise ValidationError(u"Esse anexo ultrapassa 100 MB")
  311.         elif self.atingiu_capacidade_maxima_anexo():
  312.             print '3'
  313.             raise ValidationError(u"Usuário antingiu a capacidade maxima uploads para esta sala")          
  314.         else:      
  315.             print '4'
  316.             super(Anexo, self).save(*args, **kwargs)
  317.  
  318. class Mensagem(BaseMixin):
  319.     class Meta:
  320.         verbose_name = 'Mensagem'
  321.         verbose_name_plural = 'Mensagens'
  322.     usuario = models.ForeignKey(Usuario, related_name='usuario')
  323.     descricao = models.TextField(max_length=1200, verbose_name=u'Mensagem')
  324.     sala = models.ForeignKey(Sala,related_name='sala')
  325.     #anexo = models.FileField(blank=True, null=True)
  326.     favorito = models.BooleanField(default=False)
  327.     denuncia = models.BooleanField(default=False)
  328.  
  329.     # def limite_anexo_unitario(self):
  330.     #     if self.anexo:
  331.     #         if self.anexo.size > self.sala.limite_maximo_unitario: #100mb
  332.     #             return True
  333.     #         else:
  334.     #             return False
  335.  
  336.     def __unicode__(self):              
  337.         return u"{0}".format(self.usuario.first_name)
  338.        
  339.         # return self.usuario.first_name
  340.  
  341.     def pode_enviar_mensagem(self):
  342.         #Verifica se o usuario que esta postando a mensagem é um Tutor ou Aluno
  343.         valida = False
  344.         for usuario in self.sala.usuarios.all():
  345.             if self.usuario == usuario:
  346.                 valida = True
  347.         return valida
  348.  
  349.     def possui_conteudo_mensagem(self):
  350.         if self.descricao:
  351.             return True
  352.         else:
  353.             return False
  354.  
  355.     def setar_mensagem_denuncia(self):
  356.         self.denuncia = True
  357.         self.save()
  358.  
  359.     def remover_mensagem_denuncia(self):
  360.         self.denuncia = False
  361.         self.save()
  362.  
  363.     def setar_mensagem_favorito(self):
  364.         self.favorito = True
  365.         self.save()
  366.  
  367.     def remover_mensagem_favorito(self):
  368.         self.favorito = False
  369.         self.save()
  370.  
  371.     def atingiu_capacidade_mensagem(self):
  372.         atual = int(self.sala.total_mensagem) + sys.getsizeof(self.descricao)
  373.         if self.sala.limite_mensagem:
  374.            
  375.             metade = 100 * atual/int(self.sala.limite_mensagem)            
  376.             '''
  377.            if metade >= 50:                
  378.                #Implementar o envio de email para o usuario
  379.                pass
  380.            '''
  381.             if metade >= 100:
  382.                 return True
  383.         if atual > self.sala.limite_mensagem:
  384.            
  385.             #Implementar a solicitacao de criacao de um novo chat
  386.             return True
  387.         else:
  388.            
  389.             return False
  390.  
  391.     # def atingiu_capacidade_maxima_anexo(self):
  392.     #     if self.anexo:            
  393.     #         atual = int(self.sala.total_dados) + self.anexo.size
  394.     #         limite_dados = int(self.sala.limite_dados)
  395.     #         if self.sala.limite_dados:
  396.     #             metade = 100 * atual/int(self.sala.limite_dados)
  397.     #             '''
  398.     #             if metade >= 50:
  399.     #                 #Implementar o envio de email para o usuario
  400.     #                 pass
  401.     #             '''
  402.     #         if atual > limite_dados:
  403.     #             return True
  404.     #         else:
  405.     #             return False
  406.     #     else:
  407.     #         return False
  408.  
  409.     def save(self, *args, **kwargs):
  410.         if not self.pode_enviar_mensagem():
  411.             raise ValidationError(u"Usuario não pode adicionar mensagem nessa sala")
  412.         elif not self.possui_conteudo_mensagem():
  413.             raise ValidationError(u"Usuário não pode enviar uma mensagem vazia")
  414.         # elif self.limite_anexo_unitario():
  415.         #     raise ValidationError(u"Esse anexo ultrapassa 100 MB")
  416.         # elif self.atingiu_capacidade_maxima_anexo():
  417.         #     raise ValidationError(u"Usuário antingiu a capacidade maxima uploads para esta sala")
  418.         elif self.atingiu_capacidade_mensagem():
  419.             raise ValidationError(u"Usuário antingiu a capacidade maxima mensagens para esta sala")
  420.         else:      
  421.             super(Mensagem, self).save(*args, **kwargs)
  422.  
  423. # SIGNALS
  424. from django.db.models import signals
  425. def mensagem_post_save(signal, instance, sender, created, **kwargs):    
  426.     if created:
  427.         sala = instance.sala
  428.         # if instance.anexo:            
  429.         #     sala.total_dados = str(int(sala.total_dados) + instance.anexo.size)            
  430.         sala.total_mensagem = str(int(sala.total_mensagem) + sys.getsizeof(instance.descricao))
  431.         sala.save()
  432.  
  433. signals.post_save.connect(mensagem_post_save, sender=Mensagem)
  434.  
  435. def anexo_post_save(signal, instance, sender, created, **kwargs):    
  436.     if created:
  437.         if instance.anexo:  
  438.             sala = instance.sala                  
  439.             sala.total_dados = str(int(sala.total_dados) + instance.anexo.size)                    
  440.         sala.save()
  441.  
  442. signals.post_save.connect(anexo_post_save, sender=Anexo)
  443.  
  444. def sala_post_save(signal, instance, sender, created, **kwargs):    
  445.     if created:        
  446.         try:            
  447.             config = ConfigSala.objects.get()                
  448.             instance.limite_dados = config.limite_dados
  449.             instance.limite_mensagem = config.limite_mensagem
  450.             instance.limite_usuario = config.limite_usuario
  451.             instance.limite_maximo_unitario = config.limite_maximo_unitario            
  452.             instance.save()
  453.         except Exception, e:
  454.             raise ValidationError(u"Não existe uma configuração de sala")
  455.  
  456. signals.post_save.connect(sala_post_save, sender=Sala)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement