9 | return 'usuario_{0}/{1}'.format(instance.user.id, filename)
10 |
11 |
12 | # Classes (modelos)
13 |
14 | class Estado(models.Model):
15 | nome = models.CharField(max_length=50)
16 | uf = models.CharField(max_length=2, verbose_name='UF')
17 |
18 | def __str__(self):
19 | return "{}".format(self.uf)
20 |
21 |
22 | class Cidade(models.Model):
23 | nome = models.CharField(max_length=50)
24 | estado = models.ForeignKey(Estado, on_delete=models.PROTECT)
25 |
26 | def __str__(self):
27 | return "{}".format(self.nome)
28 |
29 |
30 | class Campus(models.Model):
31 | cidade = models.CharField(max_length=50)
32 | endereco = models.CharField(max_length=150, verbose_name="endereço")
33 | telefone = models.CharField(max_length=15)
34 |
35 | def __str__(self):
36 | return "{} ({})".format(self.nome, self.descricao)
37 |
38 |
39 | class Servidor(models.Model):
40 | nome_completo = models.CharField(max_length=100)
41 | siape = models.CharField(max_length=10)
42 | cpf = models.CharField(max_length=14, verbose_name="CPF")
43 | campus = models.ForeignKey(Campus, on_delete=models.PROTECT)
44 | usuario = models.ForeignKey(
45 | User, on_delete=models.PROTECT, verbose_name="usuário")
46 |
47 |
48 | class Status(models.Model):
49 | nome = models.CharField(max_length=50)
50 | descricao = models.CharField(max_length=150, verbose_name="descrição")
51 |
52 | def __str__(self):
53 | return "{} ({})".format(self.nome, self.descricao)
54 |
55 |
56 | class Situacao(models.Model):
57 | status = models.ForeignKey(Status, on_delete=models.PROTECT)
58 | movimentado_em = models.DateTimeField(auto_now_add=True)
59 | movimentado_por = models.ForeignKey(User, on_delete=models.PROTECT)
60 | detalhes = models.CharField(max_length=255, blank=True, null=True)
61 |
62 | def __str__(self):
63 | return "{} em {} por {}".format(self.status, self.movimentado_em, self.movimentado_por)
64 |
65 |
66 | class Classe(models.Model):
67 | nome = models.CharField(max_length=50)
68 | nivel = models.IntegerField(verbose_name="nível")
69 | descricao = models.CharField(max_length=150, verbose_name="descrição", null=True, blank=True)
70 |
71 | def __str__(self):
72 | return "{} nível {}".format(self.nome, self.nivel)
73 |
74 |
75 | class Progressao(models.Model):
76 | classe = models.ForeignKey(Classe, on_delete=models.PROTECT, verbose_name="classe pretendida")
77 | data_inicial = models.DateField()
78 | data_final = models.DateField()
79 | observacao = models.CharField(max_length=255, verbose_name="observação")
80 | usuario = models.ForeignKey(User, on_delete=models.PROTECT)
81 |
82 | def __str__(self):
83 | return "{} -> {} | {} a {}".format(self.usuario, self.classe, self.data_inicial, self.data_final)
84 |
85 |
86 | class Campo(models.Model):
87 | nome = models.CharField(max_length=50)
88 | descricao = models.CharField(max_length=150, verbose_name="descrição")
89 |
90 | def __str__(self):
91 | return "{} ({})".format(self.nome, self.descricao)
92 |
93 |
94 | class Atividade(models.Model):
95 | campo = models.ForeignKey(Campo, on_delete=models.PROTECT)
96 | numero = models.IntegerField(verbose_name="Número")
97 | descricao = models.CharField(max_length=255, verbose_name="descrição")
98 | pontos = models.DecimalField(decimal_places=2, max_digits=5)
99 | detalhes = models.CharField(max_length=255, null=True, blank=True)
100 |
101 | def __str__(self):
102 | return "{} - {} ({})".format(self.numero, self.descricao, self.campo.nome)
103 |
104 | class Meta:
105 | constraints = [
106 | models.UniqueConstraint(fields=["numero", "campo"], name="unica_num_atividade_campo")
107 | ]
108 |
109 |
110 | class Comprovante(models.Model):
111 | progressao = models.ForeignKey(Progressao, on_delete=models.PROTECT, verbose_name="progressão")
112 | atividade = models.ForeignKey(Atividade, on_delete=models.PROTECT)
113 | quantidade = models.DecimalField(decimal_places=2, max_digits=5)
114 | data = models.DateField()
115 | data_final = models.DateField(null=True, blank=True, help_text="Informar apenas se o comprovante for relativo a um período.")
116 | arquivo = models.FileField(upload_to='pdf/')
117 | usuario = models.ForeignKey(User, on_delete=models.PROTECT)
118 |
119 | def __str__(self):
120 | return "[{}] {} - {}/{}".format(self.pk, self.usuario, self.progressao, self.atividade)
121 |
122 |
123 | class Validacao(models.Model):
124 | comprovante = models.ForeignKey(Comprovante, on_delete=models.PROTECT)
125 | validado_em = models.DateTimeField(auto_now_add=True)
126 | validado_por = models.ForeignKey(User, on_delete=models.PROTECT)
127 | quantidade = models.DecimalField(decimal_places=2, max_digits=5)
128 | justificativa = models.TextField(max_length=255)
129 |
130 | def __str__(self):
131 | return "[{}] Pontuação: {}/{} por {}".format(self.comprovante.pk, self.quantidade, self.comprovante.quantidade, self.validado_por)
132 |
--------------------------------------------------------------------------------
/cadastros/migrations/0004_auto_20200402_1833.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 2.2.10 on 2020-04-02 21:33
2 |
3 | import cadastros.models
4 | from django.conf import settings
5 | from django.db import migrations, models
6 | import django.db.models.deletion
7 |
8 |
9 | class Migration(migrations.Migration):
10 |
11 | dependencies = [
12 | migrations.swappable_dependency(settings.AUTH_USER_MODEL),
13 | ('cadastros', '0003_auto_20200402_1739'),
14 | ]
15 |
16 | operations = [
17 | migrations.CreateModel(
18 | name='Comprovante',
19 | fields=[
20 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
21 | ('quantidade', models.DecimalField(decimal_places=2, max_digits=5)),
22 | ('data', models.DateField()),
23 | ('data_final', models.DateField(blank=True, help_text='Informar apenas se o comprovante for relativo a um período.', null=True)),
24 | ('arquivo', models.FileField(upload_to=cadastros.models.user_path)),
25 | ],
26 | ),
27 | migrations.AlterField(
28 | model_name='atividade',
29 | name='descricao',
30 | field=models.CharField(max_length=150, verbose_name='descrição'),
31 | ),
32 | migrations.AlterField(
33 | model_name='atividade',
34 | name='pontos',
35 | field=models.DecimalField(decimal_places=2, max_digits=5),
36 | ),
37 | migrations.AlterField(
38 | model_name='campo',
39 | name='descricao',
40 | field=models.CharField(max_length=150, verbose_name='descrição'),
41 | ),
42 | migrations.AlterField(
43 | model_name='campus',
44 | name='endereco',
45 | field=models.CharField(max_length=150, verbose_name='endereço'),
46 | ),
47 | migrations.AlterField(
48 | model_name='classe',
49 | name='descricao',
50 | field=models.CharField(max_length=150, verbose_name='descrição'),
51 | ),
52 | migrations.AlterField(
53 | model_name='classe',
54 | name='nivel',
55 | field=models.IntegerField(verbose_name='nível'),
56 | ),
57 | migrations.AlterField(
58 | model_name='status',
59 | name='descricao',
60 | field=models.CharField(max_length=150, verbose_name='descrição'),
61 | ),
62 | migrations.CreateModel(
63 | name='Validacao',
64 | fields=[
65 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
66 | ('validado_em', models.DateTimeField(auto_now_add=True)),
67 | ('quantidade', models.DecimalField(decimal_places=2, max_digits=5)),
68 | ('justificativa', models.TextField(max_length=255)),
69 | ('comprovante', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='cadastros.Comprovante')),
70 | ('validado_por', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
71 | ],
72 | ),
73 | migrations.CreateModel(
74 | name='Situacao',
75 | fields=[
76 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
77 | ('movimentado_em', models.DateTimeField(auto_now_add=True)),
78 | ('detalhes', models.CharField(blank=True, max_length=255, null=True)),
79 | ('movimentado_por', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
80 | ('status', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='cadastros.Status')),
81 | ],
82 | ),
83 | migrations.CreateModel(
84 | name='Servidor',
85 | fields=[
86 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
87 | ('nome_completo', models.CharField(max_length=100)),
88 | ('siape', models.CharField(max_length=10)),
89 | ('cpf', models.CharField(max_length=14, verbose_name='CPF')),
90 | ('usuario', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='usuário')),
91 | ],
92 | ),
93 | migrations.CreateModel(
94 | name='Progressao',
95 | fields=[
96 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
97 | ('data_inicial', models.DateField()),
98 | ('data_final', models.DateField()),
99 | ('observacao', models.CharField(max_length=255, verbose_name='observação')),
100 | ('classe', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='cadastros.Classe')),
101 | ('servidor', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
102 | ],
103 | ),
104 | migrations.AddField(
105 | model_name='comprovante',
106 | name='atividade',
107 | field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='cadastros.Atividade'),
108 | ),
109 | migrations.AddField(
110 | model_name='comprovante',
111 | name='progressao',
112 | field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='cadastros.Progressao', verbose_name='progressão'),
113 | ),
114 | migrations.AddField(
115 | model_name='comprovante',
116 | name='servidor',
117 | field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
118 | ),
119 | ]
120 |
--------------------------------------------------------------------------------
/static/js/jquery.mask.min.js:
--------------------------------------------------------------------------------
1 | // jQuery Mask Plugin v1.14.16
2 | // github.com/igorescobar/jQuery-Mask-Plugin
3 | var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,n,f){a instanceof String&&(a=String(a));for(var p=a.length,k=0;kg?h=10*d:e>=h&&e!==g?c.maskDigitPosMapOld[h]||(e=h,h=h-(k-l)-a,c.maskDigitPosMap[h]&&(h=e)):h>e&&(h=h+(l-k)+f)}return h},behaviour:function(d){d=
11 | d||window.event;c.invalid=[];var e=b.data("mask-keycode");if(-1===a.inArray(e,l.byPassKeys)){e=c.getMasked();var h=c.getCaret(),g=b.data("mask-previus-value")||"";setTimeout(function(){c.setCaret(c.calculateCaretPosition(g))},a.jMaskGlobals.keyStrokeCompensation);c.val(e);c.setCaret(h);return c.callbacks(d)}},getMasked:function(a,b){var h=[],f=void 0===b?c.val():b+"",g=0,k=d.length,n=0,p=f.length,m=1,r="push",u=-1,w=0;b=[];if(e.reverse){r="unshift";m=-1;var x=0;g=k-1;n=p-1;var A=function(){return-1<
12 | g&&-1
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | {% block titulo %}
13 | :: SisProg ::
14 | {% endblock %}
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 | {% block styles %}
35 |
36 | {% endblock %}
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 | {% block logo %}
46 |
52 | {% endblock %}
53 |
54 |
55 |
56 | {% block menu %}
57 |
159 | {% endblock %}
160 |
161 |
162 |
163 |
164 | {% block conteudo %}
165 |
Página inicial
166 | {% endblock %}
167 |
168 |
169 |
170 |
171 |