├── main
├── __init__.py
├── migrations
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-39.pyc
│ │ ├── 0001_initial.cpython-39.pyc
│ │ ├── 0006_corredor.cpython-39.pyc
│ │ ├── 0005_delete_corredor.cpython-39.pyc
│ │ ├── 0012_corredor_filial.cpython-39.pyc
│ │ ├── 0007_categoria_produto.cpython-39.pyc
│ │ ├── 0004_auto_20210419_1516.cpython-39.pyc
│ │ ├── 0008_auto_20210419_1626.cpython-39.pyc
│ │ ├── 0014_auto_20210420_1324.cpython-39.pyc
│ │ ├── 0015_auto_20210420_1332.cpython-39.pyc
│ │ ├── 0017_auto_20210420_1415.cpython-39.pyc
│ │ ├── 0002_alter_corredor_codigo.cpython-39.pyc
│ │ ├── 0013_alter_funcionario_filial.cpython-39.pyc
│ │ ├── 0016_remove_funcionario_slug.cpython-39.pyc
│ │ ├── 0018_produto_validade_produto.cpython-39.pyc
│ │ ├── 0003_rename_user_funcionario_usuario.cpython-39.pyc
│ │ ├── 0009_remove_conferencia_codigo_barras.cpython-39.pyc
│ │ ├── 0010_alter_conferencia_data_conferencia.cpython-39.pyc
│ │ └── 0011_alter_validade_produto_data_validade.cpython-39.pyc
│ ├── 0005_delete_corredor.py
│ ├── 0016_remove_funcionario_slug.py
│ ├── 0009_remove_conferencia_codigo_barras.py
│ ├── 0002_alter_corredor_codigo.py
│ ├── 0003_rename_user_funcionario_usuario.py
│ ├── 0011_alter_validade_produto_data_validade.py
│ ├── 0010_alter_conferencia_data_conferencia.py
│ ├── 0013_alter_funcionario_filial.py
│ ├── 0012_corredor_filial.py
│ ├── 0004_auto_20210419_1516.py
│ ├── 0006_corredor.py
│ ├── 0015_auto_20210420_1332.py
│ ├── 0017_auto_20210420_1415.py
│ ├── 0014_auto_20210420_1324.py
│ ├── 0007_categoria_produto.py
│ ├── 0001_initial.py
│ ├── 0018_produto_validade_produto.py
│ └── 0008_auto_20210419_1626.py
├── tests.py
├── __pycache__
│ ├── admin.cpython-39.pyc
│ ├── apps.cpython-39.pyc
│ ├── forms.cpython-39.pyc
│ ├── models.cpython-39.pyc
│ ├── urls.cpython-39.pyc
│ ├── views.cpython-39.pyc
│ ├── __init__.cpython-39.pyc
│ └── filters.cpython-39.pyc
├── apps.py
├── static
│ └── css
│ │ └── main.css
├── templates
│ └── main
│ │ ├── index.html
│ │ ├── produto_detail.html
│ │ ├── nova_conferencia_itens.html
│ │ ├── nova_conferencia.html
│ │ ├── produto_list.html
│ │ ├── conferencia_detail.html
│ │ ├── conferencia_list.html
│ │ └── base.html
├── forms.py
├── filters.py
├── urls.py
├── admin.py
├── models.py
└── views.py
├── appvalidade
├── __init__.py
├── __pycache__
│ ├── urls.cpython-39.pyc
│ ├── wsgi.cpython-39.pyc
│ ├── __init__.cpython-39.pyc
│ └── settings.cpython-39.pyc
├── asgi.py
├── wsgi.py
├── urls.py
└── settings.py
├── requirements.txt
├── appValidade.sqlite3
├── README.md
├── manage.py
├── templates
└── registration
│ └── login.html
└── .gitignore
/main/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/appvalidade/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/main/migrations/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/main/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/requirements.txt
--------------------------------------------------------------------------------
/appValidade.sqlite3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/appValidade.sqlite3
--------------------------------------------------------------------------------
/main/__pycache__/admin.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/__pycache__/admin.cpython-39.pyc
--------------------------------------------------------------------------------
/main/__pycache__/apps.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/__pycache__/apps.cpython-39.pyc
--------------------------------------------------------------------------------
/main/__pycache__/forms.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/__pycache__/forms.cpython-39.pyc
--------------------------------------------------------------------------------
/main/__pycache__/models.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/__pycache__/models.cpython-39.pyc
--------------------------------------------------------------------------------
/main/__pycache__/urls.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/__pycache__/urls.cpython-39.pyc
--------------------------------------------------------------------------------
/main/__pycache__/views.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/__pycache__/views.cpython-39.pyc
--------------------------------------------------------------------------------
/main/__pycache__/__init__.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/__pycache__/__init__.cpython-39.pyc
--------------------------------------------------------------------------------
/main/__pycache__/filters.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/__pycache__/filters.cpython-39.pyc
--------------------------------------------------------------------------------
/appvalidade/__pycache__/urls.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/appvalidade/__pycache__/urls.cpython-39.pyc
--------------------------------------------------------------------------------
/appvalidade/__pycache__/wsgi.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/appvalidade/__pycache__/wsgi.cpython-39.pyc
--------------------------------------------------------------------------------
/appvalidade/__pycache__/__init__.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/appvalidade/__pycache__/__init__.cpython-39.pyc
--------------------------------------------------------------------------------
/appvalidade/__pycache__/settings.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/appvalidade/__pycache__/settings.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/__pycache__/__init__.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/__init__.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0001_initial.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0001_initial.cpython-39.pyc
--------------------------------------------------------------------------------
/main/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class MainConfig(AppConfig):
5 | default_auto_field = 'django.db.models.BigAutoField'
6 | name = 'main'
7 |
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0006_corredor.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0006_corredor.cpython-39.pyc
--------------------------------------------------------------------------------
/main/static/css/main.css:
--------------------------------------------------------------------------------
1 | p{
2 | color: royalblue;
3 | }
4 |
5 | .titulo{
6 | color: black;
7 | }
8 |
9 | .auth-card{
10 | margin: 100px auto;
11 | }
12 |
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0005_delete_corredor.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0005_delete_corredor.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0012_corredor_filial.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0012_corredor_filial.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0007_categoria_produto.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0007_categoria_produto.cpython-39.pyc
--------------------------------------------------------------------------------
/main/templates/main/index.html:
--------------------------------------------------------------------------------
1 | {% extends 'main/base.html' %}
2 |
3 | {% block content %}
4 |
Bem-vindo ao sistema de controle de validade!
5 |
6 | {% endblock content %}
7 |
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0004_auto_20210419_1516.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0004_auto_20210419_1516.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0008_auto_20210419_1626.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0008_auto_20210419_1626.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0014_auto_20210420_1324.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0014_auto_20210420_1324.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0015_auto_20210420_1332.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0015_auto_20210420_1332.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0017_auto_20210420_1415.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0017_auto_20210420_1415.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0002_alter_corredor_codigo.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0002_alter_corredor_codigo.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0013_alter_funcionario_filial.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0013_alter_funcionario_filial.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0016_remove_funcionario_slug.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0016_remove_funcionario_slug.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0018_produto_validade_produto.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0018_produto_validade_produto.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0003_rename_user_funcionario_usuario.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0003_rename_user_funcionario_usuario.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0009_remove_conferencia_codigo_barras.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0009_remove_conferencia_codigo_barras.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0010_alter_conferencia_data_conferencia.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0010_alter_conferencia_data_conferencia.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/__pycache__/0011_alter_validade_produto_data_validade.cpython-39.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0011_alter_validade_produto_data_validade.cpython-39.pyc
--------------------------------------------------------------------------------
/main/migrations/0005_delete_corredor.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-19 15:28
2 |
3 | from django.db import migrations
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('main', '0004_auto_20210419_1516'),
10 | ]
11 |
12 | operations = [
13 | migrations.DeleteModel(
14 | name='Corredor',
15 | ),
16 | ]
17 |
--------------------------------------------------------------------------------
/main/migrations/0016_remove_funcionario_slug.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-20 13:58
2 |
3 | from django.db import migrations
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('main', '0015_auto_20210420_1332'),
10 | ]
11 |
12 | operations = [
13 | migrations.RemoveField(
14 | model_name='funcionario',
15 | name='slug',
16 | ),
17 | ]
18 |
--------------------------------------------------------------------------------
/main/migrations/0009_remove_conferencia_codigo_barras.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-19 16:34
2 |
3 | from django.db import migrations
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('main', '0008_auto_20210419_1626'),
10 | ]
11 |
12 | operations = [
13 | migrations.RemoveField(
14 | model_name='conferencia',
15 | name='codigo_barras',
16 | ),
17 | ]
18 |
--------------------------------------------------------------------------------
/main/migrations/0002_alter_corredor_codigo.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-19 15:37
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('main', '0001_initial'),
10 | ]
11 |
12 | operations = [
13 | migrations.AlterField(
14 | model_name='corredor',
15 | name='codigo',
16 | field=models.IntegerField(),
17 | ),
18 | ]
19 |
--------------------------------------------------------------------------------
/appvalidade/asgi.py:
--------------------------------------------------------------------------------
1 | """
2 | ASGI config for appvalidade project.
3 |
4 | It exposes the ASGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/
8 | """
9 |
10 | import os
11 |
12 | from django.core.asgi import get_asgi_application
13 |
14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'appvalidade.settings')
15 |
16 | application = get_asgi_application()
17 |
--------------------------------------------------------------------------------
/appvalidade/wsgi.py:
--------------------------------------------------------------------------------
1 | """
2 | WSGI config for appvalidade project.
3 |
4 | It exposes the WSGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/3.2/howto/deployment/wsgi/
8 | """
9 |
10 | import os
11 |
12 | from django.core.wsgi import get_wsgi_application
13 |
14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'appvalidade.settings')
15 |
16 | application = get_wsgi_application()
17 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## Como rodar o projeto?
2 |
3 | * Clone esse repositório.
4 | * Crie um virtualenv com Python 3.
5 | * Ative o virtualenv.
6 | * Instale as dependências.
7 | * Rode as migrações.
8 |
9 | ```
10 | git clone https://github.com/dyego1912/controle-validade.git
11 | cd controle-validade
12 | python -m venv .venv
13 | source .venv/bin/activate
14 | pip install -r requirements.txt
15 | python manage.py migrate
16 | python manage.py createsuperuser --username="admin" --email=""
17 | ```
--------------------------------------------------------------------------------
/main/migrations/0003_rename_user_funcionario_usuario.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-19 11:58
2 |
3 | from django.db import migrations
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('main', '0002_alter_corredor_codigo'),
10 | ]
11 |
12 | operations = [
13 | migrations.RenameField(
14 | model_name='funcionario',
15 | old_name='user',
16 | new_name='usuario',
17 | ),
18 | ]
19 |
--------------------------------------------------------------------------------
/main/templates/main/produto_detail.html:
--------------------------------------------------------------------------------
1 | {% extends 'main/base.html' %}
2 |
3 | {% block title %} {{ produto.descricao }} {% endblock title %}
4 |
5 | {% block content %}
6 | Descricão: {{ produto.descricao }}
7 | Código: {{ produto.codigo }}
8 |
9 | Código de barras: {{ produto.codigo_barras }}
10 |
11 | Preço de venda: R$ {{ produto.preco_venda }}
12 |
13 | Categoria: {{ produto.categoria }}
14 |
15 | {% endblock content %}
16 |
17 |
18 |
--------------------------------------------------------------------------------
/main/templates/main/nova_conferencia_itens.html:
--------------------------------------------------------------------------------
1 | {% extends 'main/base.html' %}
2 |
3 | {% load bootstrap %}
4 |
5 | {% block title %} Nova conferência {% endblock %}
6 |
7 | {%block content %}
8 |
19 |
20 | {% endblock %}
--------------------------------------------------------------------------------
/main/templates/main/nova_conferencia.html:
--------------------------------------------------------------------------------
1 | {% extends 'main/base.html' %}
2 |
3 | {% load bootstrap %}
4 |
5 | {% block title %} Nova Conferência {% endblock title %}
6 |
7 | {% block content %}
8 |
9 |
20 | {% endblock content %}
--------------------------------------------------------------------------------
/main/migrations/0011_alter_validade_produto_data_validade.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-19 16:47
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('main', '0010_alter_conferencia_data_conferencia'),
10 | ]
11 |
12 | operations = [
13 | migrations.AlterField(
14 | model_name='validade_produto',
15 | name='data_validade',
16 | field=models.DateField(),
17 | ),
18 | ]
19 |
--------------------------------------------------------------------------------
/main/migrations/0010_alter_conferencia_data_conferencia.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-19 16:45
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('main', '0009_remove_conferencia_codigo_barras'),
10 | ]
11 |
12 | operations = [
13 | migrations.AlterField(
14 | model_name='conferencia',
15 | name='data_conferencia',
16 | field=models.DateField(auto_now_add=True),
17 | ),
18 | ]
19 |
--------------------------------------------------------------------------------
/main/migrations/0013_alter_funcionario_filial.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-20 10:10
2 |
3 | from django.db import migrations, models
4 | import django.db.models.deletion
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('main', '0012_corredor_filial'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterField(
15 | model_name='funcionario',
16 | name='filial',
17 | field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='filial_funcionario', to='main.filial'),
18 | ),
19 | ]
20 |
--------------------------------------------------------------------------------
/main/migrations/0012_corredor_filial.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-20 10:08
2 |
3 | from django.db import migrations, models
4 | import django.db.models.deletion
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('main', '0011_alter_validade_produto_data_validade'),
11 | ]
12 |
13 | operations = [
14 | migrations.AddField(
15 | model_name='corredor',
16 | name='filial',
17 | field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='filial_corredor', to='main.filial'),
18 | ),
19 | ]
20 |
--------------------------------------------------------------------------------
/main/templates/main/produto_list.html:
--------------------------------------------------------------------------------
1 |
2 | {% extends 'main/base.html' %}
3 |
4 | {% block title %} Produtos {% endblock %}
5 |
6 | {% block content %}
7 | {% for p in produtos %}
8 |
9 |
10 |
11 | Código: {{ p.codigo }}
12 | Preço de venda: R$ {{ p.preco_venda }}
13 | Código de barras: {{ p.codigo_barras }}
14 | Categoria: {{ p.categoria }}
15 |
16 |
17 |
18 |
19 |
20 | {% endfor %}
21 |
22 | {% endblock %}
--------------------------------------------------------------------------------
/main/forms.py:
--------------------------------------------------------------------------------
1 | # from django.forms import ModelForm
2 | from .models import Conferencia, Validade_Produto
3 |
4 | from django import forms
5 |
6 | # Criação do formulário de conferência
7 |
8 | class ConferenciaForm(forms.ModelForm):
9 | class Meta:
10 | model = Conferencia
11 | fields = ['corredor']
12 |
13 | # widgets = {'corredor': forms.TextInput}
14 |
15 | class ValidadeProdutoForm(forms.ModelForm):
16 | class Meta:
17 | model = Validade_Produto
18 | # campo conferência vai ser preenchido usando o id da conferência criada
19 | fields = ['codigo_barras', 'data_validade', 'quantidade']
20 | widgets = {'codigo_barras': forms.TextInput}
21 |
22 |
--------------------------------------------------------------------------------
/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | """Django's command-line utility for administrative tasks."""
3 | import os
4 | import sys
5 |
6 |
7 | def main():
8 | """Run administrative tasks."""
9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'appvalidade.settings')
10 | try:
11 | from django.core.management import execute_from_command_line
12 | except ImportError as exc:
13 | raise ImportError(
14 | "Couldn't import Django. Are you sure it's installed and "
15 | "available on your PYTHONPATH environment variable? Did you "
16 | "forget to activate a virtual environment?"
17 | ) from exc
18 | execute_from_command_line(sys.argv)
19 |
20 |
21 | if __name__ == '__main__':
22 | main()
23 |
--------------------------------------------------------------------------------
/main/filters.py:
--------------------------------------------------------------------------------
1 | import django_filters as filters
2 |
3 | from django_filters import DateFilter
4 |
5 | from .models import Conferencia, Produto
6 |
7 | class ConferenciaFilter(filters.FilterSet):
8 |
9 | #data_conferencia = filters.CharFilter(label='Data da Conferência')
10 |
11 | class Meta:
12 | model = Conferencia
13 | fields = ('data_conferencia',)
14 | # exclude = ['funcionario']
15 |
16 | def __init__(self, *args, **kwargs):
17 | super(ConferenciaFilter, self).__init__(*args, **kwargs)
18 | self.filters['data_conferencia'].label = 'Data da Conferência'
19 |
20 | class ProdutoFilter(filters.FilterSet):
21 | class Meta:
22 | model = Produto
23 | fields = ('codigo_barras',)
24 |
--------------------------------------------------------------------------------
/main/migrations/0004_auto_20210419_1516.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-19 15:16
2 |
3 | from django.db import migrations, models
4 | import django.db.models.deletion
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('main', '0003_rename_user_funcionario_usuario'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterModelOptions(
15 | name='filial',
16 | options={'verbose_name_plural': 'Filiais'},
17 | ),
18 | migrations.AddField(
19 | model_name='funcionario',
20 | name='filial',
21 | field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='filial', to='main.filial'),
22 | ),
23 | ]
24 |
--------------------------------------------------------------------------------
/main/migrations/0006_corredor.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-19 15:29
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('main', '0005_delete_corredor'),
10 | ]
11 |
12 | operations = [
13 | migrations.CreateModel(
14 | name='Corredor',
15 | fields=[
16 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
17 | ('nome', models.CharField(max_length=30)),
18 | ('descricao', models.CharField(max_length=50)),
19 | ],
20 | options={
21 | 'verbose_name_plural': 'Corredores',
22 | },
23 | ),
24 | ]
25 |
--------------------------------------------------------------------------------
/main/urls.py:
--------------------------------------------------------------------------------
1 | # Importa o módulo path
2 | from django.urls import path
3 |
4 | # import o arquivo de views
5 | from . import views
6 |
7 | app_name = 'main'
8 |
9 | urlpatterns = [
10 | # path("produtos/", views.produto_list, name='lista_produtos'),
11 | # path("produtos//", views.produto_detalhes, name='detalhes_produtos'),
12 | # path('login/', views.login_pagina, name='login_pagina'),
13 | path('', views.index, name='index'),
14 | path("conferencias/", views.conferencia_list, name='lista_conferencia'),
15 | path("conferencias//", views.detalhes_conferencia, name='detalhes_conferencia'),
16 | path("nova-conferencia/", views.nova_conferencia, name='nova_conferencia'),
17 | path("nova-conferencia-itens/", views.nova_conferecia_itens, name='nova_conferencia_itens'),
18 | ]
19 |
20 |
--------------------------------------------------------------------------------
/main/migrations/0015_auto_20210420_1332.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-20 13:32
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('main', '0014_auto_20210420_1324'),
10 | ]
11 |
12 | operations = [
13 | migrations.AlterField(
14 | model_name='corredor',
15 | name='slug',
16 | field=models.SlugField(max_length=30, unique=True),
17 | ),
18 | migrations.AlterField(
19 | model_name='filial',
20 | name='slug',
21 | field=models.SlugField(max_length=30, unique=True),
22 | ),
23 | migrations.AlterField(
24 | model_name='funcionario',
25 | name='slug',
26 | field=models.SlugField(unique=True),
27 | ),
28 | ]
29 |
--------------------------------------------------------------------------------
/main/templates/main/conferencia_detail.html:
--------------------------------------------------------------------------------
1 | {% extends 'main/base.html' %}
2 |
3 | {% block title %} Produtos Conferidos {% endblock %}
4 |
5 | {% block content %}
6 |
7 |
8 |
9 |
10 | | Produto |
11 | Vencimento |
12 | Quantidade |
13 |
14 |
15 |
16 | {% for p in produtos_conferencia %}
17 |
18 |
19 |
20 | | {{ p.codigo_barras }} |
21 | {{ p.data_validade }} |
22 | {{ p.quantidade }} |
23 | |
24 |
25 |
26 |
27 | {% endfor %}
28 |
29 |
30 |
31 | {% endblock %}
--------------------------------------------------------------------------------
/main/migrations/0017_auto_20210420_1415.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-20 14:15
2 |
3 | from django.db import migrations
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('main', '0016_remove_funcionario_slug'),
10 | ]
11 |
12 | operations = [
13 | migrations.RemoveField(
14 | model_name='validade_produto',
15 | name='codigo_barras',
16 | ),
17 | migrations.RemoveField(
18 | model_name='validade_produto',
19 | name='conferencia',
20 | ),
21 | migrations.AlterModelOptions(
22 | name='filial',
23 | options={'ordering': ['nome'], 'verbose_name_plural': 'Filiais'},
24 | ),
25 | migrations.DeleteModel(
26 | name='Produto',
27 | ),
28 | migrations.DeleteModel(
29 | name='Validade_Produto',
30 | ),
31 | ]
32 |
--------------------------------------------------------------------------------
/appvalidade/urls.py:
--------------------------------------------------------------------------------
1 | """appvalidade URL Configuration
2 |
3 | The `urlpatterns` list routes URLs to views. For more information please see:
4 | https://docs.djangoproject.com/en/3.2/topics/http/urls/
5 | Examples:
6 | Function views
7 | 1. Add an import: from my_app import views
8 | 2. Add a URL to urlpatterns: path('', views.home, name='home')
9 | Class-based views
10 | 1. Add an import: from other_app.views import Home
11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
12 | Including another URLconf
13 | 1. Import the include() function: from django.urls import include, path
14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
15 | """
16 | from django.contrib import admin
17 | from django.urls import path, include
18 |
19 | urlpatterns = [
20 | path('admin/', admin.site.urls),
21 | path('', include('main.urls', namespace='main')),
22 | path('accounts/', include('django.contrib.auth.urls')),
23 | ]
24 |
--------------------------------------------------------------------------------
/templates/registration/login.html:
--------------------------------------------------------------------------------
1 | {% extends 'main/base.html' %}
2 |
3 | {% load bootstrap %}
4 |
5 | {% block title %} Acessar Sistema{% endblock title %}
6 |
7 | {% block content %}
8 |
9 |
10 |
11 |
12 |
Acessar o sistema
13 |
14 |
20 |
21 |
22 |
23 |
24 | {% endblock content %}
25 |
26 |
27 |
--------------------------------------------------------------------------------
/main/templates/main/conferencia_list.html:
--------------------------------------------------------------------------------
1 | {% extends 'main/base.html' %}
2 |
3 | {% block title %} Conferências {% endblock title %}
4 |
5 | {% block content %}
6 |
7 |
14 |
15 |
16 |
17 |
18 |
19 | | Local |
20 | Funcionário |
21 | Data |
22 |
23 |
24 |
25 | {% for c in conferencias %}
26 |
27 |
28 |
29 | | {{ c.corredor.slug }} |
30 | {{ c.funcionario }} |
31 | {{ c.data_conferencia }} |
32 | |
33 |
34 |
35 | {% endfor %}
36 |
37 |
38 | {% endblock content %}
--------------------------------------------------------------------------------
/main/migrations/0014_auto_20210420_1324.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-20 13:24
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('main', '0013_alter_funcionario_filial'),
10 | ]
11 |
12 | operations = [
13 | migrations.AlterModelOptions(
14 | name='categoria',
15 | options={'ordering': ['descricao']},
16 | ),
17 | migrations.AlterModelOptions(
18 | name='funcionario',
19 | options={'ordering': ['usuario']},
20 | ),
21 | migrations.AddField(
22 | model_name='corredor',
23 | name='slug',
24 | field=models.SlugField(default='teste', max_length=30),
25 | ),
26 | migrations.AddField(
27 | model_name='filial',
28 | name='slug',
29 | field=models.SlugField(default='teste', max_length=30),
30 | ),
31 | migrations.AddField(
32 | model_name='funcionario',
33 | name='slug',
34 | field=models.SlugField(default='teste'),
35 | ),
36 | ]
37 |
--------------------------------------------------------------------------------
/main/migrations/0007_categoria_produto.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-19 15:50
2 |
3 | from django.db import migrations, models
4 | import django.db.models.deletion
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('main', '0006_corredor'),
11 | ]
12 |
13 | operations = [
14 | migrations.CreateModel(
15 | name='Categoria',
16 | fields=[
17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18 | ('descricao', models.CharField(max_length=255, unique=True)),
19 | ],
20 | ),
21 | migrations.CreateModel(
22 | name='Produto',
23 | fields=[
24 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
25 | ('codigo', models.IntegerField(unique=True)),
26 | ('codigo_barras', models.IntegerField(unique=True)),
27 | ('descricao', models.CharField(max_length=255)),
28 | ('preco_venda', models.DecimalField(decimal_places=2, max_digits=6)),
29 | ('categoria', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.categoria')),
30 | ],
31 | ),
32 | ]
33 |
--------------------------------------------------------------------------------
/main/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-19 15:37
2 |
3 | from django.conf import settings
4 | from django.db import migrations, models
5 | import django.db.models.deletion
6 |
7 |
8 | class Migration(migrations.Migration):
9 |
10 | initial = True
11 |
12 | dependencies = [
13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL),
14 | ]
15 |
16 | operations = [
17 | migrations.CreateModel(
18 | name='Corredor',
19 | fields=[
20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
21 | ('codigo', models.IntegerField(max_length=2)),
22 | ('descricao', models.CharField(max_length=50)),
23 | ],
24 | ),
25 | migrations.CreateModel(
26 | name='Filial',
27 | fields=[
28 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
29 | ('nome', models.CharField(max_length=30)),
30 | ],
31 | ),
32 | migrations.CreateModel(
33 | name='Funcionario',
34 | fields=[
35 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
36 | ('cargo', models.CharField(max_length=20)),
37 | ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)),
38 | ],
39 | ),
40 | ]
41 |
--------------------------------------------------------------------------------
/main/migrations/0018_produto_validade_produto.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-20 14:15
2 |
3 | from django.db import migrations, models
4 | import django.db.models.deletion
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('main', '0017_auto_20210420_1415'),
11 | ]
12 |
13 | operations = [
14 | migrations.CreateModel(
15 | name='Produto',
16 | fields=[
17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18 | ('codigo', models.IntegerField(unique=True)),
19 | ('codigo_barras', models.IntegerField(unique=True)),
20 | ('descricao', models.CharField(max_length=255)),
21 | ('preco_venda', models.DecimalField(decimal_places=2, max_digits=6)),
22 | ('slug', models.SlugField(max_length=255, unique=True)),
23 | ('categoria', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.categoria')),
24 | ],
25 | ),
26 | migrations.CreateModel(
27 | name='Validade_Produto',
28 | fields=[
29 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
30 | ('data_validade', models.DateField()),
31 | ('quantidade', models.IntegerField()),
32 | ('codigo_barras', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.produto')),
33 | ('conferencia', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.conferencia')),
34 | ],
35 | ),
36 | ]
37 |
--------------------------------------------------------------------------------
/main/migrations/0008_auto_20210419_1626.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 3.2 on 2021-04-19 16:26
2 |
3 | from django.db import migrations, models
4 | import django.db.models.deletion
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('main', '0007_categoria_produto'),
11 | ]
12 |
13 | operations = [
14 | migrations.CreateModel(
15 | name='Conferencia',
16 | fields=[
17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18 | ('data_conferencia', models.DateTimeField(auto_now_add=True)),
19 | ('codigo_barras', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.produto')),
20 | ],
21 | ),
22 | migrations.AlterModelOptions(
23 | name='corredor',
24 | options={'ordering': ['nome'], 'verbose_name_plural': 'Corredores'},
25 | ),
26 | migrations.CreateModel(
27 | name='Validade_Produto',
28 | fields=[
29 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
30 | ('data_validade', models.DateTimeField()),
31 | ('quantidade', models.IntegerField()),
32 | ('codigo_barras', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.produto')),
33 | ('conferencia', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.conferencia')),
34 | ],
35 | ),
36 | migrations.AddField(
37 | model_name='conferencia',
38 | name='corredor',
39 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.corredor'),
40 | ),
41 | migrations.AddField(
42 | model_name='conferencia',
43 | name='funcionario',
44 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.funcionario'),
45 | ),
46 | ]
47 |
--------------------------------------------------------------------------------
/main/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 | from .models import (
3 | Categoria,
4 | Conferencia,
5 | ConferenciaItens,
6 | Corredor,
7 | Filial,
8 | Funcionario,
9 | Produto,
10 | Validade_Produto,
11 | )
12 |
13 |
14 | @admin.register(Funcionario)
15 | class Funcionario(admin.ModelAdmin):
16 | fields = ('cargo', 'usuario', 'filial', )
17 | list_display = ('id', 'usuario', 'cargo', 'slug_filial', 'first_name')
18 |
19 | def slug_filial(self, obj):
20 | return obj.filial.slug
21 |
22 | def first_name(self, obj):
23 | return obj.usuario.first_name
24 |
25 |
26 | @admin.register(Filial)
27 | class Filial(admin.ModelAdmin):
28 | fields = ('nome', 'slug')
29 | list_display = ('nome',)
30 |
31 |
32 | @admin.register(Corredor)
33 | class Corredor(admin.ModelAdmin):
34 | fields = ('nome', 'descricao', 'filial', 'slug',)
35 | list_display = ('id', 'nome', 'descricao', 'slug', 'slug_filial',)
36 |
37 | prepopulated_fields = {'slug': ('filial', 'nome',)}
38 |
39 | search_fields = ['descricao'] # Campo de busca
40 |
41 | # retorna o slug_filial no display
42 | def slug_filial(self, obj):
43 | return obj.filial.slug
44 |
45 | def get_queryset(self, request):
46 | return super(Corredor, self).get_queryset(request).select_related('filial')
47 |
48 |
49 | @admin.register(Categoria)
50 | class Categoria(admin.ModelAdmin):
51 | fields = ('descricao',)
52 | list_display = ('descricao',)
53 |
54 |
55 | @admin.register(Produto)
56 | class Produto(admin.ModelAdmin):
57 | fields = ('codigo', 'codigo_barras', 'descricao', 'preco_venda', 'categoria', 'slug',)
58 | list_display = ('id', 'descricao', 'codigo_barras', 'categoria',)
59 |
60 | prepopulated_fields = {'slug': ('codigo', 'descricao',)}
61 |
62 |
63 | class ConferenciaItensInline(admin.TabularInline):
64 | list_display = ('conferencia', 'produto', 'quantidade', 'data_validade')
65 | model = ConferenciaItens
66 | extra = 0
67 |
68 |
69 | @admin.register(Conferencia)
70 | class Conferencia(admin.ModelAdmin):
71 | fields = ('funcionario', 'corredor',)
72 | list_display = ('id', 'funcionario', 'data_conferencia', 'slug_corredor',)
73 | inlines = (ConferenciaItensInline,)
74 |
75 | def slug_corredor(self, obj):
76 | return obj.corredor.slug
77 |
78 |
79 | @admin.register(Validade_Produto)
80 | class Validade_Produto(admin.ModelAdmin):
81 | fields = ('conferencia', 'codigo_barras', 'data_validade', 'quantidade',)
82 | list_display = ('conferencia', 'codigo_barras', 'data_validade',)
83 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | pip-wheel-metadata/
24 | share/python-wheels/
25 | *.egg-info/
26 | .installed.cfg
27 | *.egg
28 | MANIFEST
29 |
30 | # PyInstaller
31 | # Usually these files are written by a python script from a template
32 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
33 | *.manifest
34 | *.spec
35 |
36 | # Installer logs
37 | pip-log.txt
38 | pip-delete-this-directory.txt
39 |
40 | # Unit test / coverage reports
41 | htmlcov/
42 | .tox/
43 | .nox/
44 | .coverage
45 | .coverage.*
46 | .cache
47 | nosetests.xml
48 | coverage.xml
49 | *.cover
50 | *.py,cover
51 | .hypothesis/
52 | .pytest_cache/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | target/
76 |
77 | # Jupyter Notebook
78 | .ipynb_checkpoints
79 |
80 | # IPython
81 | profile_default/
82 | ipython_config.py
83 |
84 | # pyenv
85 | .python-version
86 |
87 | # pipenv
88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
91 | # install all needed dependencies.
92 | #Pipfile.lock
93 |
94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow
95 | __pypackages__/
96 |
97 | # Celery stuff
98 | celerybeat-schedule
99 | celerybeat.pid
100 |
101 | # SageMath parsed files
102 | *.sage.py
103 |
104 | # Environments
105 | .env
106 | .venv
107 | env/
108 | venv/
109 | ENV/
110 | env.bak/
111 | venv.bak/
112 |
113 | # Spyder project settings
114 | .spyderproject
115 | .spyproject
116 |
117 | # Rope project settings
118 | .ropeproject
119 |
120 | # mkdocs documentation
121 | /site
122 |
123 | # mypy
124 | .mypy_cache/
125 | .dmypy.json
126 | dmypy.json
127 |
128 | # Pyre type checker
129 | .pyre/
130 |
131 | .DS_Store
132 |
133 | media/
134 | staticfiles/
135 | .idea
136 | .ipynb_checkpoints/
137 | .vscode
138 |
--------------------------------------------------------------------------------
/main/templates/main/base.html:
--------------------------------------------------------------------------------
1 | {% load static %}
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | {% block title %} {% endblock %}
13 |
14 |
15 | {% if user.is_authenticated %}
16 |
17 |
56 |
57 | {% endif %}
58 |
59 |
60 | {% block content%}
61 |
62 | {% endblock %}
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
--------------------------------------------------------------------------------
/appvalidade/settings.py:
--------------------------------------------------------------------------------
1 | """
2 | Django settings for appvalidade project.
3 |
4 | Generated by 'django-admin startproject' using Django 3.2.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/3.2/topics/settings/
8 |
9 | For the full list of settings and their values, see
10 | https://docs.djangoproject.com/en/3.2/ref/settings/
11 | """
12 |
13 | from pathlib import Path
14 | import os
15 |
16 | # Build paths inside the project like this: BASE_DIR / 'subdir'.
17 | BASE_DIR = Path(__file__).resolve().parent.parent
18 |
19 |
20 | # Quick-start development settings - unsuitable for production
21 | # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
22 |
23 | # SECURITY WARNING: keep the secret key used in production secret!
24 | SECRET_KEY = 'django-insecure-xkg&fg&ez=i9k2#q%^5_e=g!9(5xhgru1*j11_5hur2k!wob7f'
25 |
26 | # SECURITY WARNING: don't run with debug turned on in production!
27 | DEBUG = True
28 |
29 | ALLOWED_HOSTS = ['*']
30 |
31 |
32 | # Application definition
33 |
34 | INSTALLED_APPS = [
35 | 'django.contrib.admin',
36 | 'django.contrib.auth',
37 | 'django.contrib.contenttypes',
38 | 'django.contrib.sessions',
39 | 'django.contrib.messages',
40 | 'django.contrib.staticfiles',
41 | 'main.apps.MainConfig',
42 | 'bootstrapform',
43 | ]
44 |
45 | MIDDLEWARE = [
46 | 'django.middleware.security.SecurityMiddleware',
47 | 'django.contrib.sessions.middleware.SessionMiddleware',
48 | 'django.middleware.common.CommonMiddleware',
49 | 'django.middleware.csrf.CsrfViewMiddleware',
50 | 'django.contrib.auth.middleware.AuthenticationMiddleware',
51 | 'django.contrib.messages.middleware.MessageMiddleware',
52 | 'django.middleware.clickjacking.XFrameOptionsMiddleware',
53 | ]
54 |
55 | ROOT_URLCONF = 'appvalidade.urls'
56 |
57 | TEMPLATES = [
58 | {
59 | 'BACKEND': 'django.template.backends.django.DjangoTemplates',
60 | 'DIRS': [os.path.join(BASE_DIR, 'templates')],
61 | 'APP_DIRS': True,
62 | 'OPTIONS': {
63 | 'context_processors': [
64 | 'django.template.context_processors.debug',
65 | 'django.template.context_processors.request',
66 | 'django.contrib.auth.context_processors.auth',
67 | 'django.contrib.messages.context_processors.messages',
68 | ],
69 | },
70 | },
71 | ]
72 |
73 | WSGI_APPLICATION = 'appvalidade.wsgi.application'
74 |
75 |
76 | # Database
77 | # https://docs.djangoproject.com/en/3.2/ref/settings/#databases
78 |
79 | DATABASES = {
80 | 'default': {
81 | 'ENGINE': 'django.db.backends.sqlite3',
82 | 'NAME': BASE_DIR / 'appValidade.sqlite3',
83 | }
84 | }
85 |
86 |
87 | # Password validation
88 | # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators
89 |
90 | AUTH_PASSWORD_VALIDATORS = [
91 | {
92 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
93 | },
94 | {
95 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
96 | },
97 | {
98 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
99 | },
100 | {
101 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
102 | },
103 | ]
104 |
105 |
106 | # Internationalization
107 | # https://docs.djangoproject.com/en/3.2/topics/i18n/
108 |
109 | LANGUAGE_CODE = 'pt-br'
110 |
111 | TIME_ZONE = 'America/Rio_Branco'
112 |
113 | USE_I18N = True
114 |
115 | USE_L10N = True
116 |
117 | USE_TZ = False
118 |
119 |
120 | # Static files (CSS, JavaScript, Images)
121 | # https://docs.djangoproject.com/en/3.2/howto/static-files/
122 |
123 | STATIC_URL = '/static/'
124 |
125 | # Default primary key field type
126 | # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field
127 |
128 | DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
129 |
130 | LOGIN_REDIRECT_URL = '/'
131 |
132 | LOGOUT_REDIRECT_URL = '/accounts/login'
--------------------------------------------------------------------------------
/main/models.py:
--------------------------------------------------------------------------------
1 | from django.db import models
2 | from django.contrib.auth.models import User
3 | from django.urls import reverse # Importa o módulo responsável por retornar o url reverso
4 |
5 |
6 | class TimeStampedModel(models.Model):
7 | created = models.DateTimeField(
8 | 'criado em',
9 | auto_now_add=True,
10 | auto_now=False
11 | )
12 | modified = models.DateTimeField(
13 | 'modificado em',
14 | auto_now_add=False,
15 | auto_now=True
16 | )
17 |
18 | class Meta:
19 | abstract = True
20 |
21 |
22 | class Filial(models.Model):
23 | # id automático
24 | nome = models.CharField(max_length=30)
25 | slug = models.SlugField(max_length=30, unique=True)
26 |
27 | class Meta:
28 | verbose_name_plural = 'Filiais'
29 | ordering = ['nome']
30 |
31 | def __str__(self):
32 | return str(self.nome)
33 |
34 |
35 | class Funcionario(models.Model):
36 | # Chave estrangeira para o perfil, usando o model User default
37 | usuario = models.OneToOneField(User, related_name='profile', on_delete=models.CASCADE)
38 | filial = models.ForeignKey(Filial, default=1, related_name='filial_funcionario', on_delete=models.CASCADE)
39 | cargo = models.CharField(max_length=20)
40 | #slug = models.SlugField(max_length=50, unique=True)
41 |
42 | class Meta:
43 | ordering = ['usuario']
44 |
45 | def __str__(self):
46 | return str(self.usuario)
47 |
48 |
49 | class Corredor(models.Model):
50 | # id automático
51 | nome = models.CharField(max_length=30)
52 | slug = models.SlugField(max_length=30, unique=True)
53 | descricao = models.CharField(max_length=50)
54 | filial = models.ForeignKey(Filial, default=1, related_name='filial_corredor', on_delete=models.CASCADE)
55 |
56 | class Meta:
57 | verbose_name_plural = 'Corredores'
58 | ordering = ['nome']
59 |
60 | def __str__(self):
61 | filial = str(self.filial)
62 | corredor = str(self.nome)
63 | return str(filial + ' - ' + corredor)
64 |
65 |
66 | class Categoria(models.Model):
67 | # id automático
68 | descricao = models.CharField(max_length=255, unique=True)
69 |
70 | class Meta:
71 | ordering = ['descricao']
72 |
73 | def __str__(self):
74 | return self.descricao
75 |
76 |
77 | class Produto(models.Model):
78 | # id automático
79 | codigo = models.IntegerField(unique=True)
80 | codigo_barras = models.IntegerField(unique=True)
81 | descricao = models.CharField(max_length=255, unique=False)
82 | preco_venda = models.DecimalField(decimal_places=2, max_digits=6)
83 | categoria = models.ForeignKey(Categoria, on_delete=models.CASCADE)
84 | slug = models.SlugField(max_length=255, unique=True)
85 |
86 | class Meta:
87 | verbose_name_plural = 'Produtos'
88 |
89 | def __str__(self):
90 |
91 | # Sempre que printar o id do objeto, irá retornar codigo_barras + descricao
92 |
93 | cod = str(self.codigo_barras)
94 | desc = self.descricao
95 | return str(cod + ' - ' + desc)
96 |
97 | def get_absolute_url(self):
98 | # app_name:nome_do_url, kwargs = {"campo_bd":"self.campo_bd"}
99 | return reverse("main:detalhes_produtos", kwargs={"slug": self.slug})
100 |
101 |
102 | class Conferencia(models.Model):
103 | # id automático
104 | funcionario = models.ForeignKey(Funcionario, on_delete=models.CASCADE)
105 | corredor = models.ForeignKey(Corredor, on_delete=models.CASCADE)
106 | data_conferencia = models.DateField(auto_now_add=True)
107 |
108 | def __str__(self):
109 | cod = str(self.id)
110 | data = str(self.data_conferencia)
111 | return str(cod + ' - ' + data)
112 |
113 | def get_absolute_url(self):
114 | return reverse("main:detalhes_conferencia", kwargs={"id": self.id})
115 |
116 |
117 | class Validade_Produto(models.Model):
118 | # id automático
119 | conferencia = models.ForeignKey(Conferencia, on_delete=models.CASCADE, unique=False)
120 | codigo_barras = models.ForeignKey(Produto, on_delete=models.CASCADE, unique=False)
121 | data_validade = models.DateField(unique=False)
122 | quantidade = models.IntegerField()
123 |
124 | '''
125 | def get_absolute_url(self):
126 | return reverse("main/detalhes_conferencia", kwargs={"id": self.id})
127 | '''
128 |
129 |
130 | class ConferenciaItens(TimeStampedModel):
131 | conferencia = models.ForeignKey(
132 | Conferencia,
133 | on_delete=models.CASCADE
134 | )
135 | produto = models.ForeignKey(
136 | Produto,
137 | on_delete=models.CASCADE
138 | )
139 | quantidade = models.PositiveSmallIntegerField()
140 | data_validade = models.DateField()
141 |
142 | class Meta:
143 | ordering = ('-created',)
144 | verbose_name = 'conferência item'
145 | verbose_name_plural = 'conferência itens'
146 |
147 | def __str__(self):
148 | return f'{self.produto}'
149 |
--------------------------------------------------------------------------------
/main/views.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import render, get_object_or_404, redirect
2 | from django.contrib.auth.decorators import login_required
3 | from django.http import HttpResponse
4 |
5 | from django.urls import reverse
6 |
7 | from django.core.exceptions import ValidationError
8 |
9 | # from django.forms.models import inlineformset_factory
10 |
11 | # DetailView -> Lista os detalhes
12 | # ListView -> Lista os posts
13 |
14 | # from django.views.generic import DetailView, ListView
15 |
16 | from .models import Produto, Conferencia, Validade_Produto, Funcionario
17 | from .filters import *
18 | from .forms import ConferenciaForm, ValidadeProdutoForm
19 |
20 | '''
21 | class ProdutoListView(ListView):
22 | model = Produto
23 |
24 | class ProdutoDetailView(DetailView):
25 | model = Produto
26 |
27 | class ConferenciaListView(ListView):
28 | model = Conferencia
29 |
30 | class ConferenciaDetailView(DetailView):
31 | model = Conferencia
32 |
33 | class ValidadeProdutoListView(ListView):
34 | model = Validade_Produto
35 |
36 | class ValidadeProdutoDetailView(DetailView):
37 | model = Validade_Produto
38 | '''
39 |
40 | '''
41 | def produto_list(request):
42 | produtos = Produto.objects.all().order_by('codigo') # Pega todos os produtos
43 | return render(request, 'main/produto_list.html', {'produtos': produtos})
44 |
45 | def produto_detalhes(request, slug):
46 | produto = get_object_or_404(Produto, slug=slug)
47 | return render(request, 'main/produto_detail.html', {'produto':produto})
48 | '''
49 | @login_required
50 | def index(request):
51 | #form = Funcionario.objects.get(id=4)
52 | return render(request, 'main/index.html')
53 |
54 | @login_required
55 | def conferencia_list(request):
56 | conferencias = Conferencia.objects.all()
57 | filtro = ConferenciaFilter(request.GET, queryset = conferencias)
58 | conferencias = filtro.qs
59 | return render(request, 'main/conferencia_list.html', {'conferencias': conferencias, 'filtro': filtro})
60 |
61 | '''
62 | @login_required
63 | def produto_list(requsest, codigo_barras):
64 | produtos = Produto.objects.all()
65 | filtro = ProdutoFilter(request.GET, queryset = produtos)
66 | produtos = filtro.qs
67 |
68 | return render(request, 'main/produto_list.html', {'Produtos': produtos, 'filtro': filtro})
69 | '''
70 |
71 | @login_required
72 | def detalhes_conferencia(request, id):
73 | # conferencia = get_object_or_404(Validade_Produto, id=id)
74 | produtos_conferencia = Validade_Produto.objects.filter(conferencia_id = id).order_by('codigo_barras')
75 | print("detalhes_conferencia")
76 | return render(request, 'main/conferencia_detail.html', {'produtos_conferencia':produtos_conferencia})
77 |
78 | @login_required
79 | def nova_conferencia(request):
80 | print("nova_conferencia")
81 | formulario_conferencia = ConferenciaForm()
82 | print(request.method)
83 |
84 | if request.method == 'POST':
85 | print("if")
86 | formulario_conferencia = ConferenciaForm(request.POST)
87 |
88 | if(formulario_conferencia.is_valid()):
89 | print("válido")
90 | nova_conferencia = formulario_conferencia.save(commit=False)
91 | func_id = request.user.id
92 | funcionario = Funcionario.objects.get(usuario_id = func_id)
93 | corredor_conferencia = formulario_conferencia.cleaned_data['corredor']
94 |
95 | nova_conferencia = Conferencia(corredor = corredor_conferencia, funcionario=funcionario)
96 | nova_conferencia.save()
97 |
98 | id_conferencia = nova_conferencia.id
99 |
100 | print('func: ',func_id)
101 | print('corredor: ',corredor_conferencia)
102 | context = {'id_conf': id_conferencia}
103 | print(context)
104 | # print(reverse('detalhes_conferencia', id_conferencia))
105 | #else:
106 | #print(formulario_validade_produtos.errors)
107 |
108 | # return redirect(reverse('detalhes_conferencia', id_conferencia))
109 | # return redirect('/conferencias/'+str(id_conferencia)) # redirecionar para a página de adição de itens
110 | return redirect('/nova-conferencia-itens/') # redirecionar para a página de adição de itens
111 |
112 | elif(request.method == 'GET'):
113 | formulario_conferencia = ConferenciaForm()
114 |
115 | # Se for um get, redireciona pra página de nova conferência
116 | return render(request, 'main/nova_conferencia.html', {'form': formulario_conferencia})
117 |
118 | def nova_conferecia_itens(request):
119 | form = ValidadeProdutoForm()
120 |
121 | if request.method == 'POST':
122 | print('método post')
123 | formulario_validade_produtos = ConferenciaForm(request.POST)
124 |
125 | if (formulario_validade_produtos.is_valid()):
126 | codigo_barras = formulario_validade_produtos.cleaned_data['data_barras']
127 | data_validade = formulario_validade_produtos.cleaned_data['data_validade']
128 | quantidade = formulario_validade_produtos.cleaned_data['validade']
129 |
130 | produto = Validade_Produto(
131 | codigo_barras=codigo_barras,
132 | conferencia=id_conferencias,
133 | data_validade=data_validade,
134 | quantidade=quantidade)
135 |
136 | return render(request, 'main/nova_conferencia_itens.html', {'form': formulario_validade_produtos})
137 |
138 | elif request.method == 'GET':
139 | form = ValidadeProdutoForm()
140 |
141 | return render(request, 'main/nova_conferencia_itens.html', {'form': form})
142 |
143 |
144 | def busca_produto(request, codigo_barras):
145 | produto = Produto.objects.get(codigo_barras=codigo_barras)
146 |
147 |
148 |
149 | '''
150 | print(formulario_validade_produtos['codigo_barras'].value())
151 | campo_codigo = formulario_validade_produtos['codigo_barras'].value()
152 |
153 | try:
154 | produto = Produto.objects.get(codigo_barras='7894561230')
155 | except Produto.DoesNotExist:
156 | raise ValidationError("Produto não encontrado")
157 | '''
158 |
159 | '''
160 | codigo = produto
161 | data_validade = formulario_validade_produtos.cleaned_data['data_validade']
162 | quantidade = formulario_validade_produtos.cleaned_data['quantidade']
163 |
164 | print(codigo)
165 | print(data_validade)
166 | print(quantidade)
167 |
168 | produto = Validade_Produto(codigo_barras=codigo, conferencia=nova_conferencia, data_validade=data_validade, quantidade=quantidade)
169 | produto.save()
170 | '''
--------------------------------------------------------------------------------