class RelacaoAbono(models.Model): objects = models.Manager() abonos = models.ManyToManyField(Abono, blank=True) data_inicio = models.DateTimeField() data_termino = models.DateTimeField() class Meta: verbose_name = 'Relação de abonos' verbose_name_plural = "Relações de abonos" ordering = ['-data_inicio'] @staticmethod def factory(data_inicio, data_termino): abonos = Abono.objects.filter( Q(deferido=True) & Q(criado_em__gte=data_inicio) & Q(criado_em__lte=data_termino) ) relacao = RelacaoAbono.objects.create( data_inicio=data_inicio, data_termino=data_termino ) for abono in abonos: relacao.abonos.add(abono) relacao.save() return relacao
class LinhaRelatorio(models.Model): objects = models.Manager() trabalhador = models.ForeignKey(Trabalhador, on_delete=models.SET_NULL, null=True) horas_extras = models.FloatField(default=0, validators=[MinValueValidator(0)]) adicional_noturno = models.FloatField(default=0, validators=[MinValueValidator(0)]) faltas = models.IntegerField(default=0, validators=[MinValueValidator(0)]) dias_faltas = [] criado_em = models.DateTimeField(auto_now_add=True) modificado_em = models.DateTimeField(auto_now=True) def __str__(self): return "%s(%.1f, %.1f, %d)" % (self.trabalhador.nome, self.horas_extras, self.adicional_noturno, self.faltas) class Meta: ordering = ['trabalhador__nome'] verbose_name = "Linha de Relatório" verbose_name_plural = 'Linhas de Relatório' @staticmethod def transferencia(relatorio_fonte, relatorio_alvo, linha): if relatorio_fonte and relatorio_alvo and linha: if linha in relatorio_fonte.linhas.all(): try: relatorio_fonte.linhas.remove(linha) relatorio_alvo.linhas.add(linha) relatorio_fonte.save() relatorio_alvo.save() except Exception as e: print("Erro: %s", e)
class Ferias(models.Model): OPCOES = ( (15, "Quinze dias"), (30, "Trinta dias"), ) objects = models.Manager() class FeriasFruidas(models.Manager): def all(self): return super().get_queryset().filter( Q(tipo='f') & Q(data_termino__lt=timezone.now().date()) & Q(deferida=True)) class FeriasIndeferidas(models.Manager): def all(self): return super().get_queryset().filter(Q(tipo='f') & Q(deferida=False)) class FeriasEmAndamento(models.Manager): def all(self): return super().get_queryset().filter(Q(tipo='f') & Q(data_inicio__lte=timezone.now().date()) & Q( data_termino__gte=timezone.now().date()) & Q(deferida=True)) fruidas = FeriasFruidas() indeferidas = FeriasIndeferidas() em_andamento = FeriasEmAndamento() trabalhador = models.ForeignKey(Trabalhador, on_delete=models.CASCADE) qtd_dias = models.IntegerField(choices=OPCOES) data_inicio = models.DateField() data_termino = models.DateField(editable=False) criado_em = models.DateTimeField(auto_now_add=True) modificado_em = models.DateTimeField(auto_now=True) deferida = models.BooleanField(editable=False, default=False) observacoes = models.TextField(blank=True, editable=False) tipo = models.CharField(max_length=2, default='f', editable=False) fruida = models.BooleanField(editable=False, default=False) criado_por = models.ForeignKey(User, on_delete=models.SET_NULL, editable=False, null=True, blank=True) def save(self, validacao=True, *args, **kwargs): self.data_termino = self.data_inicio + timedelta(days=self.qtd_dias - 1) if not validacao: self.deferida = False else: self.deferida = valida_ferias(self) super(Ferias, self).save(*args, **kwargs) def __str__(self): return '%d dias - %s -saindo %s' % (self.qtd_dias, self.trabalhador.nome, self.data_inicio.strftime("%d/%m/%Y")) def get_absolute_url(self): return reverse('ferias') class Meta: verbose_name_plural = "Férias" verbose_name = "Férias" ordering = ['data_inicio']
class Abono(models.Model): expedientes_opt = [ ('matutino', 'Matutino'), ('vespertino', 'Vespertino'), ('integral', 'Integral'), ] objects = models.Manager() class AbonosFruidos(models.Manager): def all(self): return super().get_queryset().filter(Q(data__lt=timezone.now().date()) & Q(deferido=True)) class AbonosIndeferidos(models.Manager): def all(self): return super().get_queryset().filter(Q(deferido=False)) class AbonoEmAndamento(models.Manager): def all(self): return super().get_queryset().filter(Q(data=timezone.now().date()) & Q(deferido=True)) fruidos = AbonosFruidos() indeferidos = AbonosIndeferidos() em_andamento = AbonoEmAndamento() trabalhador = models.ForeignKey(Trabalhador, on_delete=models.CASCADE) expediente = models.CharField(choices=expedientes_opt, max_length=20) data = models.DateField() criado_em = models.DateTimeField(auto_now_add=True) modificado_em = models.DateTimeField(auto_now=True) deferido = models.BooleanField(editable=False, default=False) observacoes = models.TextField(blank=True, editable=False) fruido = models.BooleanField(editable=False, default=False) criado_por = models.ForeignKey(User, on_delete=models.SET_NULL, editable=False, null=True, blank=True) def is_this_month(self): data = timezone.now().date() if self.data: return ((data.month == self.data.month) and (data.year == self.data.year)) return False def save(self, validacao=True, *args, **kwargs): if not validacao: self.deferido = False else: self.deferido = True super(Abono, self).save(*args, **kwargs) def __str__(self): return '%s - %s' % (self.trabalhador.nome, self.data.strftime("%d/%m/%Y")) def get_absolute_url(self): return reverse('abono') class Meta: ordering = ['data']
class Content(models.Model): """Content to be created, displayed, updated, delete""" x = models.IntegerField() y = models.IntegerField() z = models.IntegerField(blank=True, null=True) objects = models.Manager() def __str__(self): return str(self.id)
class ChefeDeSetor(models.Model): objects = models.Manager() nome = models.CharField(max_length=200) legenda = models.CharField(max_length=100) criado_em = models.DateTimeField(auto_now_add=True) modificado = models.DateTimeField(auto_now=True) class Meta: verbose_name_plural = "Chefes de Setor" ordering = ['nome']
class Banner(models.Model): objects = models.Manager() titulo = models.CharField(max_length=200, blank=True) descricao = models.TextField(blank=True) link_img = models.URLField(unique=True) link = models.URLField() criado_em = models.DateTimeField(auto_now_add=True) modificado_em = models.DateTimeField(auto_now=True) class Meta: ordering = ['-criado_em']
class LicencaPremio(Ferias): OPCOES = ( (15, "Quinze dias"), (30, "Trinta dias"), (45, "Quarenta e cinco dias"), (60, "Sessenta dias"), (75, "Setenta e cinco dias"), (90, "Noventa dias") ) objects = models.Manager() class LicencasFruidas(models.Manager): def all(self): return super().get_queryset().filter(Q(data_termino__lt=timezone.now().date()) & Q(deferida=True)) class LicencasIndeferidas(models.Manager): def all(self): return super().get_queryset().filter(Q(deferida=False)) class LicencaEmAndamento(models.Manager): def all(self): return super().get_queryset().filter(Q(data_inicio__lte=timezone.now().date()) & Q(deferida=True) & Q( data_termino__gte=timezone.now().date())) fruidas = LicencasFruidas() indeferidas = LicencasIndeferidas() em_andamento = LicencaEmAndamento() def __str__(self): return '%d dias - %s -saindo %s' % (self.qtd_dias, self.trabalhador.nome, self.data_inicio.strftime("%d/%m/%Y")) def save(self, validacao=True, *args, **kwargs): self.data_termino = self.data_inicio + timedelta(days=self.qtd_dias - 1) self.tipo = 'l' if not validacao: self.deferida = False else: self.deferida = valida_ferias(self) super(LicencaPremio, self).save(validacao, *args, **kwargs) def get_absolute_url(self): return reverse('licenca_premio') class Meta: verbose_name_plural = "Licença Prêmio" verbose_name = "Licenças Prêmio" ordering = ['data_inicio']
class Setor(models.Model): objects = models.Manager() nome = models.CharField(max_length=100, unique=True) criado_em = models.DateTimeField(auto_now_add=True) modificado_em = models.DateTimeField(auto_now=True) criado_por = models.ForeignKey(User, on_delete=models.SET_NULL, editable=False, null=True, blank=True) def __str__(self): return '%s - desde %s' % (self.nome, self.criado_em.strftime("%d/%m/%Y")) def get_absolute_url(self): return reverse('setor') class Meta: verbose_name_plural = 'Setores' ordering = ['nome']
class IndeedJobs(models.Model): title = models.CharField(max_length=200, null=True, blank=True) slug = models.SlugField(max_length=100, unique=True, blank=True, null=True) company = models.CharField(max_length=200, null=True, blank=True) city = models.CharField(max_length=200, null=True, blank=True) salary = models.CharField(max_length=200, null=True, blank=True) # experience = models.CharField(max_length=100, null=True, blank=True) job_description = HTMLField(null=True, blank=True) employment_type = models.CharField(max_length=100, null=True, blank=True) date_posted = models.CharField(max_length=200, null=True, blank=True) job_url = models.URLField(max_length=1000, unique=True, null=True, blank=True) pub_date = models.DateTimeField(null=True, auto_created=True, auto_now_add=True) timestamp = models.DateTimeField(auto_now_add=True, auto_created=True) objects = models.Manager() job_objects = IndeedJobsManager() categories_objects = IndeedCategoriesManager() class Meta: ordering = ["-id"] def __str__(self): return str(self.title) def _get_unique_slug(self): slug = slugify(self.title) unique_slug = slug num = 1 while IndeedJobs.objects.filter(slug=unique_slug).exists(): unique_slug = '{}-{}'.format(slug, num) num += 1 return unique_slug def save(self, *args, **kwargs): if not self.slug: self.slug = self._get_unique_slug() super().save(*args, **kwargs) def get_absolute_url(self): from django.urls import reverse return reverse('detail', args=[str(self.slug, )])
class User(models.Model): objects = models.Manager() username = models.CharField(max_length=32, verbose_name="사용자명", unique=True) password = models.CharField(max_length=32, verbose_name="비밀번호") registered_dttm = models.DateTimeField(auto_now_add=True, verbose_name="등록시간") def __str__(self): return self.username class Meta: db_table = "Users" verbose_name = "user" verbose_name_plural = "Users"
class ChannelRaw(models.Model): objects = models.Manager() _id = models.CharField(primary_key=True, max_length=100) url = models.URLField(validators=[URLValidator], blank=False) lang_code = models.CharField(max_length=10, blank=False) main_html = models.TextField(blank=False) uploads_html = models.TextField(blank=False) def __str__(self) -> str: return str(self.id) def save(self, **kwargs): # note: always do model.clean_fields() before model.save() # https://stackoverflow.com/questions/17816229/django-model-blank-false-does-not-work super(ChannelRaw, self).save() @property def id(self) -> str: return self._id
class Result(models.Model): objects = models.Manager() # 기본 항목 strategy_result = models.OneToOneField('Strategy', to_field="strategyNumber", on_delete=models.CASCADE, verbose_name="전략 고유번호당 결과") writer_name = models.ForeignKey('User', to_field="username", on_delete=models.CASCADE, verbose_name="전략 작성자명") # 결과 항목 profit_all = models.IntegerField(verbose_name="총 손익") currentAsset = models.IntegerField(verbose_name="현재자산") Final_yield = models.IntegerField(verbose_name="최종수익률") #m_cagr = models.IntegerField(verbose_name="월간수익률") # 선택된 종목들 리스트 selected_companys = models.CharField(max_length=1024, verbose_name="선택된 종목 리스트") # 추가된 항목들 Current_assets_by_date = models.TextField(verbose_name="날짜별 현재 자산 정보", blank=True) Winning_rate = models.TextField(verbose_name="승률 (익절한 횟수와 손절한 횟수 정보)", blank=True) Reavalanced_code_name_list = models.TextField( verbose_name="리벨런싱한 종목 ( n번째 리벨런싱에 따른 종목 )", blank=True) def set_selected_companys(self, x): self.selected_companys = json.dumps(x) def get_selected_companys(self): return json.loads(self.selected_companys) def __str__(self): return str(self.strategy_result) class Meta: db_table = "Results" verbose_name = "result" verbose_name_plural = "Results"
class Trabalhador(models.Model): objects = models.Manager() OPCOES = ( ('ferias', "Férias"), ('licenca', "Licença-prêmio"), ('abono', "Abono"), ('ativo', "Ativo"), ('atestado', "Atestado Médico"), ) nome = models.CharField(max_length=100, unique=True) user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='usuario', editable=False) matricula = models.CharField(unique=True, max_length=15) registro = models.CharField(unique=True, max_length=15) funcao = models.CharField(max_length=50) setor = models.ForeignKey(Setor, on_delete=models.SET_NULL, null=True) data_admissao = models.DateTimeField() criado_em = models.DateTimeField(auto_now_add=True) modificado_em = models.DateTimeField(auto_now=True) situacao = models.CharField(max_length=100, choices=OPCOES) rg = models.CharField(max_length=20, blank=True, null=True) ctps = models.CharField(max_length=20, blank=True, null=True) cpf = models.CharField(max_length=20, blank=True, null=True) ctps_serie = models.CharField(max_length=20, blank=True, null=True) criado_por = models.ForeignKey(User, on_delete=models.SET_NULL, editable=False, null=True, blank=True) def __str__(self): return '%s : %s - %s - desde %s' % ( self.nome, self.funcao, self.setor.nome, self.data_admissao.strftime("%d/%m/%Y")) def save(self, *args, **kwargs): if not self.user: self.user = User.objects.create_user(self.matricula, password=self.matricula) super(Trabalhador, self).save(*args, **kwargs) def get_absolute_url(self): return reverse('trabalhadores') class Meta: verbose_name_plural = 'Trabalhadores' ordering = ['nome']
class VideoRaw(models.Model): objects = models.Manager() _id = models.CharField(primary_key=True, max_length=100) # on looking up channel_id, djongo will create a pymongo query for that url = models.URLField(validators=[URLValidator], blank=False) video_info = models.JSONField(blank=False, default=None) # should be serialised with json.dumps main_html = models.TextField(blank=False) channel_id = models.CharField(max_length=100, blank=False) def __str__(self) -> str: return str(self.id) def save(self, **kwargs): # note: always do model.clean_fields() before model.save() # https://stackoverflow.com/questions/17816229/django-model-blank-false-does-not-work super(VideoRaw, self).save() @property def id(self) -> str: return self._id
class TracksRaw(models.Model): objects = models.Manager() _id = models.CharField(primary_key=True, max_length=100) # caption id must be unique caption_id = models.CharField(max_length=100, blank=False, unique=True) # can be null raw_xml = models.TextField(blank=True, default=None) # don't need a relation to video, as we'll look this up by caption id. def __str__(self) -> str: return str(self.id) def save(self, **kwargs): # note: always do model.clean_fields() before model.save() # https://stackoverflow.com/questions/17816229/django-model-blank-false-does-not-work super(TracksRaw, self).save() @property def id(self) -> str: return self._id
class Lembrete(models.Model): options = [ ('d', 'Diário'), ('s', 'Semanal'), ('m', 'Mensal'), ] objects = models.Manager() titulo = models.CharField(max_length=200) mensagem = models.TextField() url_name = models.CharField(max_length=100) periodicidade = models.CharField(max_length=2, choices=options) dia = models.IntegerField( validators=[MinValueValidator(1), MaxValueValidator(31)], help_text="Semanal: indique o dia da semana(0=domingo, 1=segunda,...). Mensal: caso não haja tal dia em algum mês(30, 31), o lembrete será exibido no último dia do mês" ) mostrado_esse_mes = models.BooleanField(default=False) criado_em = models.DateTimeField(auto_now_add=True) modificado_em = models.DateTimeField(auto_now=True) @property def is_valid(self): is_valid = False hoje = timezone.now() weekday = hoje.weekday() if not self.mostrado_esse_mes: # aqui a lógica muda dependendo da periodicidade if self.periodicidade == 'm': if weekday >= self.dia: is_valid = True elif self.periodicidade == 's': if self.dia <= weekday < 6: is_valid = True elif self.periodicidade == 'd': if hoje.hour == self.day: is_valid = True return is_valid class Meta: ordering = ['dia']
class Conf(models.Model): ADC_CONST = 1.143 objects = models.Manager() proximas_folgas = models.BooleanField( default=True, help_text='Mostra uma tabela na página principal, representando os trabalhadores que tem as folgas próximas' ) em_andamento = models.BooleanField( default=True, help_text='Mostra uma tabela na página principal, representando os trabalhadores que estão de folga no momento' ) proximos_retornos = models.BooleanField( default=True, help_text='Mostra uma tabela na página principal, representando os trabalhadores que estão no final de sua ' 'folga ' ) calculo_de_adicional = models.BooleanField( default=False, verbose_name="Cálculo de Adicional Noturno", help_text='Multiplica o total de horas por 1,143, caso marcado' )
class IdiomRaw(models.Model): objects = models.Manager() _id = models.CharField(primary_key=True, max_length=100) text = models.CharField(max_length=100, blank=False) wiktionary_url = models.CharField(max_length=100, blank=False) # could be null parser_info = models.JSONField(blank=True, default=None) # get this from wiktionary parser (python) # could be null (if request was erroneous) main_html = models.TextField(blank=True, default=None) def __str__(self) -> str: return self.text def save(self, **kwargs): # note: always do model.clean_fields() before model.save() # https://stackoverflow.com/questions/17816229/django-model-blank-false-does-not-work self.clean_fields() # self.validate_unique() # must do this before saving super(IdiomRaw, self).save() @property def id(self) -> str: return self._id
class Strategy(models.Model): objects = models.Manager() # 기본 항목 strategyName = models.CharField(max_length=128, verbose_name="전략명") strategyNumber = models.IntegerField(verbose_name="전략고유번호", unique=True) writerName = models.ForeignKey('User', on_delete=models.CASCADE, verbose_name="전략작성자명") strategyDescription = models.TextField(verbose_name="전략설명") strategyStar = models.IntegerField(verbose_name="별점") # Tab1 기본 항목 investment = models.IntegerField(verbose_name="투자원금") investment_Start = models.IntegerField(verbose_name="투자 시작일") investment_End = models.IntegerField(verbose_name="투자 마감일") maxStockNumber = models.IntegerField(verbose_name="최대 보유 종목수") userMarketCap = models.IntegerField(verbose_name="대상기업 최소시가총액") # Tab2 퀄리티 지표 userROE = models.IntegerField(verbose_name="최저 ROE", blank=True) userROA = models.IntegerField(verbose_name="최저 ROA", blank=True) userSalesPerProfit = models.IntegerField(verbose_name="매출액대비 순이익률", blank=True) userSalesPerMargin = models.IntegerField(verbose_name="매출액 대비 영업이익률", blank=True) userSalesIncrese = models.IntegerField(verbose_name="매출액 증가율", blank=True) userMarginIncrease = models.IntegerField(verbose_name="영업이익 증가율", blank=True) userProfitIncrease = models.IntegerField(verbose_name="순이익 증가율", blank=True) userDebtRatio = models.IntegerField(verbose_name="부채비율", blank=True) userCurrentRatio = models.IntegerField(verbose_name="유동비율", blank=True) userOperatingActivityCashFlow = models.BooleanField( verbose_name="영업활동현금흐름", blank=True) userInvestmentActivityCashFlow = models.BooleanField( verbose_name="투자활동현금흐름", blank=True) userFinancialActivityCashFlow = models.BooleanField( verbose_name="재무활동현금흐름", blank=True) # Tab3 벨류 지표 # 주당 가치평가 지표 userEPS_Start = models.IntegerField(verbose_name="주당순이익(min)", blank=True) userEPS_End = models.IntegerField(verbose_name="주당순이익(max)", blank=True) userBPS_Start = models.IntegerField(verbose_name="주당순자산(min)", blank=True) userBPS_End = models.IntegerField(verbose_name="주당순자산(max)", blank=True) userCFPS_Start = models.IntegerField(verbose_name="주당현금흐름(min)", blank=True) userCFPS_End = models.IntegerField(verbose_name="주당현금흐름(max)", blank=True) userSPS_Start = models.IntegerField(verbose_name="주당매출액(min)", blank=True) userSPS_End = models.IntegerField(verbose_name="주당매출액(max)", blank=True) userDPS_Start = models.IntegerField(verbose_name="주당배당금(min)", blank=True) userDPS_End = models.IntegerField(verbose_name="주당배당금(max)", blank=True) # 주가 가치평가 지표 userPER_Start = models.IntegerField(verbose_name="주가수익배수(min)", blank=True) userPER_End = models.IntegerField(verbose_name="주가수익배수(max)", blank=True) userPBR_Start = models.IntegerField(verbose_name="주가순자산배수(min)", blank=True) userPBR_End = models.IntegerField(verbose_name="주가순자산배수(max)", blank=True) userPCR_Start = models.IntegerField(verbose_name="주가현금흐름배수(min)", blank=True) userPCR_End = models.IntegerField(verbose_name="주가현금흐름배수(max)", blank=True) userPSR_Start = models.IntegerField(verbose_name="주가매출액배수(min)", blank=True) userPSR_End = models.IntegerField(verbose_name="주가매출액배수(max)", blank=True) userMarketDiviend_Start = models.IntegerField(verbose_name="시가 배당률(min)", blank=True) userMarketDiviend_End = models.IntegerField(verbose_name="시가 배당률(max)", blank=True) # Tab4 매수 & 매도 조건 purchaseCondition = models.IntegerField(verbose_name="매수조건(%)") targetPrice = models.IntegerField(verbose_name="목표가격") sellPrice = models.IntegerField(verbose_name="손절가격") revalancingPeriod = models.IntegerField( verbose_name="리벨런싱 주기 ( 0:분기별 | 1:연간 | 2:선택안함 )") # 추가 데이터들 ( 전략들의 현재상태 ) strategyOpenedInPlatform = models.BooleanField(verbose_name="플랫폼에 오픈하기", blank=True) def __str__(self): return self.strategyName class Meta: db_table = "Strategy" verbose_name = "Strategy" verbose_name_plural = "Strategy"
class Relatorio(models.Model): objects = models.Manager() class Vigente(models.Manager): def all(self): data = datetime.now() return super().get_queryset().filter( Q(mes=data.month - 1 if data.month != 1 else 12) & Q(ano=data.year if data.month != 1 else data.year - 1) & (Q(estado='terminado') | Q(estado='oficial')) ) def em_aberto(self): data = datetime.now() return super().get_queryset().filter( Q(mes=data.month - 1 if data.month != 1 else 12) & Q(ano=data.year if data.month != 1 else data.year - 1) & (Q(estado='terminado') | Q(estado="justificativas")) ) def finalizados(self): data = datetime.now() return super().get_queryset().filter( Q(mes=data.month - 1 if data.month != 1 else 12) & Q(ano=data.year if data.month != 1 else data.year - 1) & Q(estado='oficial') ) setor = models.ForeignKey(Setor, on_delete=models.SET_NULL, null=True) linhas = models.ManyToManyField(LinhaRelatorio, blank=True) estado = models.CharField(max_length=100, default="vazio") num_oficio = models.CharField(max_length=10) mes = models.IntegerField( default=mes_anterior(), validators=[ MinValueValidator(1), MaxValueValidator(12), ] ) ano = models.IntegerField(default=ano_padrao(), validators=[MaxValueValidator(datetime.now().year)]) data_fechamento = models.DateField(blank=True, null=True) criado_em = models.DateTimeField(auto_now_add=True) modificado_em = models.DateTimeField(auto_now=True) vigentes = Vigente() def is_valid(self): return bool([linha for linha in self.linhas.all() if linha.horas_extras > 0 or linha.adicional_noturno > 0 or linha.faltas > 0]) @property def referencia(self): return str(self.mes) + "-" + str(self.ano) def __str__(self): return "%s - %d/%d" % (self.setor.nome, self.mes, self.ano) class Meta: verbose_name = "Relatório" verbose_name_plural = "Relatórios" ordering = ['-criado_em', 'setor__nome']