diff --git a/Procfile b/Procfile index cf855438..27ff1843 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web: gunicorn confidence_chronogram.wsgi --log-file - +web: gunicorn confidencechronogram.wsgi --log-file - diff --git a/account/templates/account/cadastrar_cliente.html b/account/templates/account/cadastrar_cliente.html deleted file mode 100644 index e979e268..00000000 --- a/account/templates/account/cadastrar_cliente.html +++ /dev/null @@ -1,87 +0,0 @@ -{% extends 'base-funcionario.html' %} - -{% block content %} - -
-
{% csrf_token %} -

Cadastro Cliente

-
- Dados de cadastro (Cliente) -

- -

-

- -

-

- -

-

- -

-

- -

- -

-
- -

-

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

-
- -
-
- -{% endblock %} \ No newline at end of file diff --git a/account/templates/account/cadastrar_funcionario.html b/account/templates/account/cadastrar_funcionario.html deleted file mode 100644 index a78da1fe..00000000 --- a/account/templates/account/cadastrar_funcionario.html +++ /dev/null @@ -1,65 +0,0 @@ -{% extends 'base-funcionario.html' %} - -{% block content %} -
-
{% csrf_token %} -

Cadastro Funcionário

-
- Dados de cadastro (Funcionário) -

- -

- -

-
- -

-

- -

-

- -

-

- -

-

- -

-

- -

- -

- -

-
- -
-
- -{% endblock %} \ No newline at end of file diff --git a/account/urls.py b/account/urls.py deleted file mode 100644 index d74fd143..00000000 --- a/account/urls.py +++ /dev/null @@ -1,16 +0,0 @@ -from django.urls import path -from . import views - -app_name = 'account' - -urlpatterns = [ - #path('registrar/', views.register.as_view(), name='registrar'), - # Registra USUARIO cliente/funcionario - path('registrar/clie', views.register_clie, name='registrar_cliente'), - path('cadastro/cliente', views.register_cliente, name='register_cliente'), - path('cadastro/submit', views.submit_register_cliente), - - path('registrar/func', views.register_func, name='registrar_funcionario'), - path('funcionario', views.register_funcionario, name='register_funcionario'), - path('submit', views.submit_register_funcionario), -] \ No newline at end of file diff --git a/account/views.py b/account/views.py deleted file mode 100644 index a1dbf8d1..00000000 --- a/account/views.py +++ /dev/null @@ -1,121 +0,0 @@ -from django.contrib.auth.decorators import login_required -from django.shortcuts import render, redirect, HttpResponse -from django.contrib.auth.forms import UserCreationForm, AuthenticationForm -from django.contrib.auth import authenticate, login, logout -from django.urls import reverse_lazy -from django.contrib.auth.models import User - -from django.views.generic import CreateView, ListView, TemplateView - -from confidence_chronograms.models import Cliente, Funcionario - - -""" class register(CreateView): - form_class = UserCreationForm - success_url = reverse_lazy('account:registrar') - template_name = 'register.html' """ - -# --------Registro Cliente------------- -@login_required(login_url="/login/") -def register_clie(request): - if request.method == "POST": - form_usuario = UserCreationForm(request.POST) - if form_usuario.is_valid(): - form_usuario.save() - # depois que cadastrar redireciona para cadastro de cliente - return redirect('account:register_cliente') - else: - form_usuario = UserCreationForm() - return render(request, 'register_clie.html', {'form_usuario': form_usuario}) - -# mostra registro cliente para criar -@login_required(login_url="/login/") -def register_cliente(request): - id_cliente = request.GET.get("id") - usuario = User.objects.all().order_by('-username') - dados = {} - if id_cliente: - dados["cliente"] = Cliente.objects.get(id=id_cliente) - #dados["usuario"] = usuario - return render(request, 'cadastrar_cliente.html', {'usuario': usuario}, dados) - -# submit registro cliente -# colocar foreinkey usando id -@login_required(login_url="/login/") -def submit_register_cliente(request): - # verificar com ID de usuario para restringir... - # usuario = - if request.method == "POST": - nome = request.POST.get("nome") - razao_social = request.POST.get("razao_social") - tipo_pessoa = request.POST.get("tipo_pessoa") - cpf_cnpj= request.POST.get("cpf_cnpj") - rg_ie = request.POST.get("rg_ie") - endereco = request.POST.get("endereco") - cidade = request.POST.get("cidade") - cep = request.POST.get("cep") - uf = request.POST.get("uf") - email = request.POST.get("email") - fone1 = request.POST.get("fone1") - usuario_cli_id = request.POST.get("usuario_cli_id") - Cliente.objects.create( - nome=nome, - razao_social=razao_social, - tipo_pessoa=tipo_pessoa, - cpf_cnpj=cpf_cnpj, - rg_ie=rg_ie, - endereco=endereco, - cidade=cidade, - cep=cep, - uf=uf, - email=email, - fone1=fone1, - usuario_cli_id=usuario_cli_id, - ) - return redirect("/confidencechronogram/funcionario") - - -# --------Registro Funcionário ------------- -@login_required(login_url="/login/") -def register_func(request): - if request.method == "POST": - form_usuario = UserCreationForm(request.POST) - if form_usuario.is_valid(): - form_usuario.save() - return redirect('account:register_funcionario') - else: - form_usuario = UserCreationForm() - return render(request, 'register_func.html', {'form_usuario': form_usuario}) - -# mostra registro funcionario -@login_required(login_url="/login/") -def register_funcionario(request): - id_funcionario = request.GET.get("id") - # ordena pelo ultimo, no caso o ID do ultimo cadastrado - usuario = User.objects.all().order_by('-username') - dados = {} - if id_funcionario: - dados["funcionario"] = Funcionario.objects.get(id=id_funcionario) - return render(request, 'cadastrar_funcionario.html', {'usuario': usuario}, dados) - - -@login_required(login_url="/login/") -def submit_register_funcionario(request): - if request.POST: - nome = request.POST.get("nome") - fone1 = request.POST.get("fone1") - endereco = request.POST.get("endereco") - cidade = request.POST.get("cidade") - cep = request.POST.get("cep") - uf = request.POST.get("uf") - usuario_fun_id = request.POST.get("usuario_fun_id") - Funcionario.objects.create( - nome=nome, - fone1=fone1, - endereco=endereco, - cidade=cidade, - cep=cep, - uf=uf, - usuario_fun_id=usuario_fun_id - ) - return redirect("/confidencechonogra/funcionario") \ No newline at end of file diff --git a/account/__init__.py b/apps/__init__.py similarity index 100% rename from account/__init__.py rename to apps/__init__.py diff --git a/account/migrations/__init__.py b/apps/account/__init__.py similarity index 100% rename from account/migrations/__init__.py rename to apps/account/__init__.py diff --git a/account/admin.py b/apps/account/admin.py similarity index 100% rename from account/admin.py rename to apps/account/admin.py diff --git a/account/apps.py b/apps/account/apps.py similarity index 100% rename from account/apps.py rename to apps/account/apps.py diff --git a/apps/account/forms.py b/apps/account/forms.py new file mode 100644 index 00000000..00b3efd3 --- /dev/null +++ b/apps/account/forms.py @@ -0,0 +1,19 @@ +from django import forms + +from apps.confidencechronograms.models import Cliente, Funcionario + + +class ClienteForm(forms.ModelForm): + class Meta: + model = Cliente + fields = ( + 'nome', 'endereco', 'razao_social', 'tipo_pessoa', 'cpf_cnpj', 'rg_ie', + 'cep', 'uf', 'email', 'fone1', 'usuario_cli' + ) + +class FuncionarioForm(forms.ModelForm): + class Meta: + model = Funcionario + fields = ( + 'nome', 'endereco', 'cpf', 'rg', 'fone1', 'bloqueado', 'usuario_fun' + ) \ No newline at end of file diff --git a/confidence_chronograms/__init__.py b/apps/account/migrations/__init__.py similarity index 100% rename from confidence_chronograms/__init__.py rename to apps/account/migrations/__init__.py diff --git a/account/models.py b/apps/account/models.py similarity index 100% rename from account/models.py rename to apps/account/models.py diff --git a/apps/account/templates/alterar_senha.html b/apps/account/templates/alterar_senha.html new file mode 100644 index 00000000..b89638bb --- /dev/null +++ b/apps/account/templates/alterar_senha.html @@ -0,0 +1,36 @@ + + + + + Alterar senha + + +
+
+ {% csrf_token %} + +
+ {{form_senha.old_password.errors}} + + {{form_senha.old_password}} +
+ +
+ {{form_senha.new_password1.errors}} + + {{form_senha.new_password1}} +
+ +
+ {{form_senha.new_password2.errors}} + + {{form_senha.new_password2}} +
+ +
+ +
+
+
+ + \ No newline at end of file diff --git a/account/templates/account/register_clie.html b/apps/account/templates/cadastro_cliente.html similarity index 72% rename from account/templates/account/register_clie.html rename to apps/account/templates/cadastro_cliente.html index a3e45214..ead0ecc0 100644 --- a/account/templates/account/register_clie.html +++ b/apps/account/templates/cadastro_cliente.html @@ -1,31 +1,28 @@ {% extends 'base-funcionario.html' %} - {% block content %} -
- -

|Cadastrar Usuário Cliente|

+
{% csrf_token %} - -
+

|Cadastro de Usuário Cliente|

+
{{form_usuario.username.errors}} {{form_usuario.username}}
- -
+ +
{{form_usuario.password1.errors}} {{form_usuario.password1}}
- -
+ +
{{form_usuario.password2.errors}} {{form_usuario.password2}}
- -
+ +
diff --git a/account/templates/account/register_func.html b/apps/account/templates/cadastro_funcionario.html similarity index 72% rename from account/templates/account/register_func.html rename to apps/account/templates/cadastro_funcionario.html index 43ab08eb..38405f5f 100644 --- a/account/templates/account/register_func.html +++ b/apps/account/templates/cadastro_funcionario.html @@ -1,31 +1,28 @@ {% extends 'base-funcionario.html' %} - {% block content %} -
- -

|Cadastrar Usuário Funcionário|

+
{% csrf_token %} - -
+

|Cadastro de Usuário Funcionário|

+
{{form_usuario.username.errors}} {{form_usuario.username}}
- -
+ +
{{form_usuario.password1.errors}} {{form_usuario.password1}}
- -
+ +
{{form_usuario.password2.errors}} {{form_usuario.password2}}
- -
+ +
diff --git a/apps/account/templates/continue_cad_cliente.html b/apps/account/templates/continue_cad_cliente.html new file mode 100644 index 00000000..cb292060 --- /dev/null +++ b/apps/account/templates/continue_cad_cliente.html @@ -0,0 +1,15 @@ +{% extends 'base-funcionario.html' %} + +{% load crispy_forms_tags %} + +{% block content %} +
+

Cadastro Funcionário

+
+ {% csrf_token %} + {{ form|crispy }} + + +
+
+{% endblock %} diff --git a/apps/account/templates/continue_cad_funcionario.html b/apps/account/templates/continue_cad_funcionario.html new file mode 100644 index 00000000..6bd1cec0 --- /dev/null +++ b/apps/account/templates/continue_cad_funcionario.html @@ -0,0 +1,16 @@ +{% extends 'base-funcionario.html' %} + +{% load crispy_forms_tags %} + +{% block content %} +
+

Cadastro Funcionário

+
+ {% csrf_token %} + {{ form|crispy }} + + +
+
+ +{% endblock %} \ No newline at end of file diff --git a/apps/account/templates/login.html b/apps/account/templates/login.html new file mode 100644 index 00000000..2799ac79 --- /dev/null +++ b/apps/account/templates/login.html @@ -0,0 +1,28 @@ + + + + + Title + + +
+ {% csrf_token %} + +
+ {{form_login.username.errors}} + + {{form_login.username}} +
+ +
+ {{form_login.password.errors}} + + {{form_login.password}} +
+ +
+ +
+
+ + \ No newline at end of file diff --git a/account/tests.py b/apps/account/tests.py similarity index 100% rename from account/tests.py rename to apps/account/tests.py diff --git a/apps/account/urls.py b/apps/account/urls.py new file mode 100644 index 00000000..13178177 --- /dev/null +++ b/apps/account/urls.py @@ -0,0 +1,17 @@ +from django.contrib import admin +from django.urls import path, include +from .views import * + +app_name = 'account' + +urlpatterns = [ + path('logar_usuario', logar_usuario, name="logar_usuario"), + path('deslogar_usuario', deslogar_usuario, name="deslogar_usuario"), + path('alterar_senha/', alterar_senha, name='alterar_senha'), + path('cadastrar_cliente', cadastrar_cliente, name="cadastrar_cliente"), + path('cadastrar_funcionario', cadastrar_funcionario, name="cadastrar_funcionario"), + path('cadastro/continue_cad_cliente', continue_cad_cliente, name="continue_cad_cliente"), + path('continue_cad_funcionario', continue_cad_funcionario, name="continue_cad_funcionario"), + path('cadastro/submit', submit_continue_cad_cliente), + path('submit', submit_continue_cad_funcionario), +] \ No newline at end of file diff --git a/apps/account/views.py b/apps/account/views.py new file mode 100644 index 00000000..34257da2 --- /dev/null +++ b/apps/account/views.py @@ -0,0 +1,186 @@ +from django.contrib.auth.decorators import login_required +from django.shortcuts import render, redirect +from django.contrib.auth.forms import UserCreationForm, AuthenticationForm, PasswordChangeForm +from django.contrib.auth import authenticate, login, logout, update_session_auth_hash +from django.contrib.auth.models import User + +from apps.confidencechronograms.models import Cliente, Funcionario +#com o forms vou conseguir resolver para incluir o usuario_cli e usuario_fun +from .forms import ClienteForm, FuncionarioForm + +# Cadastro de cliente +def cadastrar_cliente(request): + if request.method == "POST": + form_usuario = UserCreationForm(request.POST) + if form_usuario.is_valid(): + form_usuario.save() + return redirect('account:continue_cad_cliente') + else: + form_usuario = UserCreationForm() + return render(request, 'cadastro_cliente.html', {'form_usuario': form_usuario}) + +# mostra continue cadastro cliente +@login_required(login_url="/login/") +def continue_cad_cliente(request): + if request.method == "POST": + form = ClienteForm(request.POST) + if form.is_valid(): + #'nome', 'endereco', 'razao_social', 'tipo_pessoa', 'cpf_cnpj', 'rg_ie', + # 'cep', 'uf', 'email', 'fone1', 'usuario_cli' + nome = form.cleaned_data['nome'] + endereco = form.cleaned_data['endereco'] + razao_social = form.cleaned_data['razao_social'] + tipo_pessoa = form.cleaned_data['tipo_pessoa'] + cpf_cnpj = form.cleaned_data['cpf_cnpj'] + rg_ie = form.cleaned_data['rg_ie'] + cep = form.cleaned_data['cep'] + uf = form.cleaned_data['uf'] + email = form.cleaned_data['email'] + fone1 = form.cleaned_data['fone1'] + usuario_cli = form.cleaned_data['usuario_cli'] + novo = Cliente( + nome=nome, endereco=endereco, razao_social=razao_social, + tipo_pessoa=tipo_pessoa, cpf_cnpj=cpf_cnpj, rg_ie=rg_ie, + cep=cep, uf=uf, email=email, fone1=fone1, + usuario_cli=usuario_cli + ) + novo.save() + #form.save() + return redirect("funcionario") + else: + form = ClienteForm() + return render(request, "continue_cad_cliente.html", {"form": form}) + + +@login_required(login_url="/login/") +def submit_continue_cad_cliente(request): + if request.POST: + nome = request.POST.get("nome") + fone1 = request.POST.get("fone1") + endereco = request.POST.get("endereco") + cidade = request.POST.get("cidade") + cep = request.POST.get("cep") + uf = request.POST.get("uf") + usuario_cli_id = request.POST.get("usuario_cli_id") + Funcionario.objects.create( + nome=nome, + fone1=fone1, + endereco=endereco, + cidade=cidade, + cep=cep, + uf=uf, + usuario_cli_id=usuario_cli_id + ) + return redirect("/confidencechronogram/funcionario") + +#cadastro de funcinário +def cadastrar_funcionario(request): + if request.method == "POST": + form_usuario = UserCreationForm(request.POST) + if form_usuario.is_valid(): + form_usuario.save() + return redirect('account:continue_cad_funcionario') + else: + form_usuario = UserCreationForm() + return render(request, 'cadastro_funcionario.html', {'form_usuario': form_usuario}) + +# mostra continue cadastro funcionário +@login_required(login_url="/login/") +def continue_cad_funcionario(request): + """ Continuação do Cadastro do Funcionário. + """ + if request.method == "POST": + form = FuncionarioForm(request.POST) + if form.is_valid(): + form.save() + return redirect("funcionario") + else: + form = FuncionarioForm() + return render(request, "continue_cad_funcionario.html", {"form": form}) + # if request.method == "POST": + # form = FuncionarioForm(request.POST) + # if form.is_valid(): + # #'nome', 'endereco', 'cpf', 'rg', 'fone1', 'bloqueado', 'usuario_fun' + # nome = form.cleaned_data['nome'] + # endereco = form.cleaned_data['endereco'] + # cpf = form.cleaned_data['cpf'] + # rg = form.cleaned_data['rg'] + # fone1 = form.cleaned_data['fone1'] + # bloqueado = form.cleaned_data['bloqueado'] + # usuario_fun = form.cleaned_data['usuario_fun'] + # novo = Funcionario( + # nome=nome, endereco=endereco, cpf=cpf, + # rg=rg, fone1=fone1, bloqueado=bloqueado, usuario_fun=usuario_fun + # ) + # novo.save() + # return redirect("funcionario") + # else: + # form = FuncionarioForm() + # return render(request, "continue_cad_funcionario.html", {"form": form}) + + +@login_required(login_url="/login/") +def submit_continue_cad_funcionario(request): + if request.POST: + nome = request.POST.get("nome") + fone1 = request.POST.get("fone1") + endereco = request.POST.get("endereco") + cidade = request.POST.get("cidade") + cep = request.POST.get("cep") + uf = request.POST.get("uf") + usuario_fun_id = request.POST.get("usuario_fun_id") + Funcionario.objects.create( + nome=nome, + fone1=fone1, + endereco=endereco, + cidade=cidade, + cep=cep, + uf=uf, + usuario_fun_id=usuario_fun_id + ) + return redirect("/confidencechronogram/funcionario") + + +def logar_usuario(request): + if request.method == "POST": + username = request.POST["username"] + password = request.POST["password"] + usuario = authenticate(request, username=username, password=password) + if usuario is not None: + login(request, usuario) + return redirect('index') + else: + form_login = AuthenticationForm() + else: + form_login = AuthenticationForm() + return render(request, 'login.html', {'form_login': form_login}) + + +@login_required(login_url='/logar_usuario') +def deslogar_usuario(request): + logout(request) + return redirect('index') + +@login_required(login_url='/login/') +def alterar_senha(request): + if request.method == "POST": + form_senha = PasswordChangeForm(request.user, request.POST) + if form_senha.is_valid(): + user = form_senha.save() + update_session_auth_hash(request, user) + return redirect('index') + else: + form_senha = PasswordChangeForm(request.user) + return render(request, 'alterar_senha.html', {'form_senha': form_senha}) + +@login_required(login_url="/login/") +def upload_chamado(request): + """ Cria formulário do chamado e envia objeto cliente para pegar id. """ + if request.method == "POST": + form = ChamadoForm(request.POST, request.FILES) + if form.is_valid(): + form.save() + return redirect("chamado_list") + else: + form = ChamadoForm() + return render(request, "upload_chamado.html", {"form": form}) \ No newline at end of file diff --git a/confidence_chronograms/migrations/__init__.py b/apps/confidencechronograms/__init__.py similarity index 100% rename from confidence_chronograms/migrations/__init__.py rename to apps/confidencechronograms/__init__.py diff --git a/confidence_chronograms/admin.py b/apps/confidencechronograms/admin.py similarity index 92% rename from confidence_chronograms/admin.py rename to apps/confidencechronograms/admin.py index 1e243379..13b06343 100644 --- a/confidence_chronograms/admin.py +++ b/apps/confidencechronograms/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from confidence_chronograms.models import Chronogram, Task, Funcionario, Cliente +from apps.confidencechronograms.models import Chronogram, Task, Cliente, Funcionario class FuncAdmin(admin.ModelAdmin): list_display = ('nome', 'cargo', 'endereco', 'fone1', 'bloqueado') diff --git a/apps/confidencechronograms/apps.py b/apps/confidencechronograms/apps.py new file mode 100644 index 00000000..4fcb8385 --- /dev/null +++ b/apps/confidencechronograms/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ConfidencechronogramsConfig(AppConfig): + name = 'confidencechronograms' diff --git a/confidence_chronograms/migrations/0001_initial.py b/apps/confidencechronograms/migrations/0001_initial.py similarity index 83% rename from confidence_chronograms/migrations/0001_initial.py rename to apps/confidencechronograms/migrations/0001_initial.py index 7a0f4d51..a53b5836 100644 --- a/confidence_chronograms/migrations/0001_initial.py +++ b/apps/confidencechronograms/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.0.2 on 2020-09-07 21:30 +# Generated by Django 3.0.2 on 2020-09-12 22:05 from django.conf import settings from django.db import migrations, models @@ -31,40 +31,20 @@ class Migration(migrations.Migration): 'ordering': ['date_added'], }, ), - migrations.CreateModel( - name='Id_dependency', - fields=[ - ('id_dep', models.CharField(max_length=10, primary_key=True, serialize=False)), - ], - options={ - 'verbose_name': 'Id da Dependência', - 'verbose_name_plural': 'Ids das Dependências', - }, - ), - migrations.CreateModel( - name='Id_task', - fields=[ - ('id_tk', models.CharField(max_length=10, primary_key=True, serialize=False)), - ], - options={ - 'verbose_name': 'Id da Tarefa', - 'verbose_name_plural': 'Ids das Tarefas', - }, - ), migrations.CreateModel( name='Task', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('ident', models.CharField(max_length=4, verbose_name='Identificador')), ('name', models.CharField(max_length=40, verbose_name='Nome')), + ('task_text', models.TextField(verbose_name='Descrição da Tarefa')), ('start_date', models.DateField(verbose_name='Inicio')), ('end_date', models.DateField(verbose_name='Termino')), ('progress', models.CharField(max_length=3, verbose_name='Progresso %')), - ('task_text', models.TextField(verbose_name='Descrição da Tarefa')), + ('dependencies', models.CharField(max_length=10, verbose_name='Dependências')), ('price', models.DecimalField(decimal_places=4, max_digits=10, verbose_name='Valor')), ('date_added', models.DateTimeField(auto_now_add=True, verbose_name='Data de criação')), - ('id_dep', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='confidence_chronograms.Id_dependency', verbose_name='Id Dependência')), - ('id_tk', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='confidence_chronograms.Id_task', verbose_name='Id Tarefa')), - ('task_chronogram', models.ManyToManyField(related_name='ChronogramTarefas', to='confidence_chronograms.Chronogram', verbose_name='ChronogramaTarefa')), + ('chronogram', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='confidencechronograms.Chronogram')), ], options={ 'verbose_name': 'Tarefa', @@ -91,8 +71,7 @@ class Migration(migrations.Migration): ('cidade', models.CharField(blank=True, max_length=30, null=True)), ('cep', models.CharField(blank=True, max_length=9, null=True)), ('uf', models.CharField(blank=True, max_length=2, null=True)), - ('email', models.EmailField(max_length=60)), - ('email2', models.EmailField(blank=True, max_length=60, null=True)), + ('email', models.EmailField(blank=True, max_length=60, null=True)), ('senha', models.CharField(blank=True, max_length=16, null=True)), ('fone1', models.CharField(max_length=16, verbose_name='Telefone 1')), ('fone2', models.CharField(blank=True, max_length=20, null=True, verbose_name='Telefone 2')), @@ -146,8 +125,8 @@ class Migration(migrations.Migration): ('dia_venc', models.DateTimeField(blank=True, null=True, verbose_name='Dia do Vencimento')), ('senha', models.CharField(blank=True, max_length=6, null=True)), ('date_added', models.DateTimeField(auto_now_add=True)), - ('funcionario', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='confidence_chronograms.Funcionario')), - ('usuario_cli', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Usuário Cliente')), + ('funcionario', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='confidencechronograms.Funcionario')), + ('usuario_cli', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'Cliente', @@ -157,7 +136,12 @@ class Migration(migrations.Migration): ), migrations.AddField( model_name='chronogram', - name='cliente', - field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='confidence_chronograms.Cliente'), + name='client', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='confidencechronograms.Cliente'), + ), + migrations.AddField( + model_name='chronogram', + name='usuario', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), ] diff --git a/apps/confidencechronograms/migrations/__init__.py b/apps/confidencechronograms/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/confidence_chronograms/models.py b/apps/confidencechronograms/models.py similarity index 98% rename from confidence_chronograms/models.py rename to apps/confidencechronograms/models.py index 25cb7c45..a9be935b 100644 --- a/confidence_chronograms/models.py +++ b/apps/confidencechronograms/models.py @@ -148,7 +148,6 @@ class Task(models.Model): name = models.CharField(verbose_name = 'Nome', max_length=40) task_text = models.TextField(verbose_name = 'Descrição da Tarefa') start_date = models.DateField(verbose_name = 'Inicio') - # Duração já encontra a data final. tipo int com date? end_date = models.DateField(verbose_name = 'Termino') progress = models.CharField(verbose_name= 'Progresso %', max_length=3) dependencies = models.CharField(verbose_name='Dependências', max_length=10) @@ -160,7 +159,7 @@ class Meta: verbose_name = 'Tarefa' verbose_name_plural = 'Tarefas' #ordenar - ordering = ['date_added', 'chronogram'] + ordering = ['date_added'] def __str__(self): diff --git a/confidence_chronograms/static/css/bootstrap.css b/apps/confidencechronograms/static/css/bootstrap.css similarity index 100% rename from confidence_chronograms/static/css/bootstrap.css rename to apps/confidencechronograms/static/css/bootstrap.css diff --git a/confidence_chronograms/static/css/business-frontpage.css b/apps/confidencechronograms/static/css/business-frontpage.css similarity index 100% rename from confidence_chronograms/static/css/business-frontpage.css rename to apps/confidencechronograms/static/css/business-frontpage.css diff --git a/confidence_chronograms/static/css/frappe-gantt.css b/apps/confidencechronograms/static/css/frappe-gantt.css similarity index 100% rename from confidence_chronograms/static/css/frappe-gantt.css rename to apps/confidencechronograms/static/css/frappe-gantt.css diff --git a/confidence_chronograms/static/css/login.css b/apps/confidencechronograms/static/css/login.css similarity index 100% rename from confidence_chronograms/static/css/login.css rename to apps/confidencechronograms/static/css/login.css diff --git a/confidence_chronograms/static/css/styles.css b/apps/confidencechronograms/static/css/styles.css similarity index 100% rename from confidence_chronograms/static/css/styles.css rename to apps/confidencechronograms/static/css/styles.css diff --git a/confidence_chronograms/static/images/android-icon-36x36.png b/apps/confidencechronograms/static/images/android-icon-36x36.png similarity index 100% rename from confidence_chronograms/static/images/android-icon-36x36.png rename to apps/confidencechronograms/static/images/android-icon-36x36.png diff --git a/confidence_chronograms/static/js/bootstrap.bundle.js b/apps/confidencechronograms/static/js/bootstrap.bundle.js similarity index 100% rename from confidence_chronograms/static/js/bootstrap.bundle.js rename to apps/confidencechronograms/static/js/bootstrap.bundle.js diff --git a/confidence_chronograms/static/js/frappe-gantt.min.js b/apps/confidencechronograms/static/js/frappe-gantt.min.js similarity index 100% rename from confidence_chronograms/static/js/frappe-gantt.min.js rename to apps/confidencechronograms/static/js/frappe-gantt.min.js diff --git a/confidence_chronograms/static/js/jquery.min.js b/apps/confidencechronograms/static/js/jquery.min.js similarity index 100% rename from confidence_chronograms/static/js/jquery.min.js rename to apps/confidencechronograms/static/js/jquery.min.js diff --git a/confidence_chronograms/static/js/main.js b/apps/confidencechronograms/static/js/main.js similarity index 100% rename from confidence_chronograms/static/js/main.js rename to apps/confidencechronograms/static/js/main.js diff --git a/confidence_chronograms/templates/base-cliente.html b/apps/confidencechronograms/templates/base-cliente.html similarity index 100% rename from confidence_chronograms/templates/base-cliente.html rename to apps/confidencechronograms/templates/base-cliente.html diff --git a/confidence_chronograms/templates/base-funcionario.html b/apps/confidencechronograms/templates/base-funcionario.html similarity index 97% rename from confidence_chronograms/templates/base-funcionario.html rename to apps/confidencechronograms/templates/base-funcionario.html index b5dd565d..29ae7445 100644 --- a/confidence_chronograms/templates/base-funcionario.html +++ b/apps/confidencechronograms/templates/base-funcionario.html @@ -34,7 +34,6 @@ + + +
+ + +{% endblock %} \ No newline at end of file diff --git a/confidence_chronograms/templates/home.html b/apps/confidencechronograms/templates/home.html similarity index 100% rename from confidence_chronograms/templates/home.html rename to apps/confidencechronograms/templates/home.html diff --git a/confidence_chronograms/templates/login.html b/apps/confidencechronograms/templates/login.html similarity index 100% rename from confidence_chronograms/templates/login.html rename to apps/confidencechronograms/templates/login.html diff --git a/confidence_chronograms/templates/model-footer.html b/apps/confidencechronograms/templates/model-footer.html similarity index 100% rename from confidence_chronograms/templates/model-footer.html rename to apps/confidencechronograms/templates/model-footer.html diff --git a/confidence_chronograms/templates/model-header.html b/apps/confidencechronograms/templates/model-header.html similarity index 100% rename from confidence_chronograms/templates/model-header.html rename to apps/confidencechronograms/templates/model-header.html diff --git a/confidence_chronograms/templates/model-page.html b/apps/confidencechronograms/templates/model-page.html similarity index 100% rename from confidence_chronograms/templates/model-page.html rename to apps/confidencechronograms/templates/model-page.html diff --git a/confidence_chronograms/templates/task.html b/apps/confidencechronograms/templates/task.html similarity index 100% rename from confidence_chronograms/templates/task.html rename to apps/confidencechronograms/templates/task.html diff --git a/confidence_chronograms/tests.py b/apps/confidencechronograms/tests.py similarity index 100% rename from confidence_chronograms/tests.py rename to apps/confidencechronograms/tests.py diff --git a/confidence_chronograms/urls.py b/apps/confidencechronograms/urls.py similarity index 81% rename from confidence_chronograms/urls.py rename to apps/confidencechronograms/urls.py index 419a2a7a..a3d93033 100644 --- a/confidence_chronograms/urls.py +++ b/apps/confidencechronograms/urls.py @@ -1,7 +1,11 @@ -from django.urls import path +from django.urls import path, re_path from . import views from django.views.generic import RedirectView +from django.conf import settings +from django.conf.urls.static import static +from django.views.static import serve + urlpatterns = [ #--------------redireciona para HOME--------------------------- path('', views.home, name='home'), @@ -34,5 +38,7 @@ # views.delete_funcionario, name="del_funcionario" #), + re_path(r'^media/(?P.*)$', serve,{'document_root': settings.MEDIA_ROOT}), + re_path(r'^static/(?P.*)$', serve,{'document_root': settings.STATIC_ROOT}), -] \ No newline at end of file +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/confidence_chronograms/views.py b/apps/confidencechronograms/views.py similarity index 97% rename from confidence_chronograms/views.py rename to apps/confidencechronograms/views.py index 2923639d..254d92a6 100644 --- a/confidence_chronograms/views.py +++ b/apps/confidencechronograms/views.py @@ -2,12 +2,11 @@ from django.contrib.auth.decorators import login_required from django.contrib.auth import authenticate, login, logout from django.contrib import messages -# from confidence_chronograms.models import Chronogram # from datetime import datetime, timedelta -# from django.http.response import Http404, JsonResponse -# from django.contrib.auth.models import User +from django.http.response import Http404, JsonResponse +from django.contrib.auth.models import User import json -from confidence_chronograms.models import Task, Cliente, Funcionario, Chronogram +from apps.confidencechronograms.models import Task, Cliente, Funcionario, Chronogram #def index(request): @@ -46,7 +45,7 @@ def confidencechronogram(request): #return redirect("/confidencechronogram/cliente") return redirect("/chronogram") - +# lista as tarefas do chronograma para o cliente @login_required(login_url='/login/') def list_chronogram(request): """ retorna o cronograma com às tarefas (javascript) @@ -154,7 +153,6 @@ def dados_cliente(request): return render(request, "confidence-cliente.html", dados) -#não recebe parâmetro id? @login_required(login_url="/login/") def cliente(request): dados = {} diff --git a/confidence_chronogram/urls.py b/confidence_chronogram/urls.py deleted file mode 100644 index 568c8437..00000000 --- a/confidence_chronogram/urls.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.contrib import admin -from django.urls import path, include - -urlpatterns = [ - path('', include('confidence_chronograms.urls')), - path('admin/', admin.site.urls), - path('account/', include('account.urls')), - path('account/', include('django.contrib.auth.urls')), -] - diff --git a/confidence_chronogram/wsgi.py b/confidence_chronogram/wsgi.py deleted file mode 100644 index e92770f3..00000000 --- a/confidence_chronogram/wsgi.py +++ /dev/null @@ -1,18 +0,0 @@ -""" -WSGI config for confidence_chronogram project. - -It exposes the WSGI callable as a module-level variable named ``application``. - -For more information on this file, see -https://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/ -""" - -import os - -from django.core.wsgi import get_wsgi_application - -from dj_static import Cling - -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'confidence_chronogram.settings') - -application = Cling(get_wsgi_application()) diff --git a/confidence_chronograms/__pycache__/__init__.cpython-37.pyc b/confidence_chronograms/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index e4d66bcd..00000000 Binary files a/confidence_chronograms/__pycache__/__init__.cpython-37.pyc and /dev/null differ diff --git a/confidence_chronograms/__pycache__/admin.cpython-37.pyc b/confidence_chronograms/__pycache__/admin.cpython-37.pyc deleted file mode 100644 index 197c44bb..00000000 Binary files a/confidence_chronograms/__pycache__/admin.cpython-37.pyc and /dev/null differ diff --git a/confidence_chronograms/__pycache__/models.cpython-37.pyc b/confidence_chronograms/__pycache__/models.cpython-37.pyc deleted file mode 100644 index 5f47cef9..00000000 Binary files a/confidence_chronograms/__pycache__/models.cpython-37.pyc and /dev/null differ diff --git a/confidence_chronograms/__pycache__/views.cpython-37.pyc b/confidence_chronograms/__pycache__/views.cpython-37.pyc deleted file mode 100644 index f64ff01d..00000000 Binary files a/confidence_chronograms/__pycache__/views.cpython-37.pyc and /dev/null differ diff --git a/confidence_chronograms/apps.py b/confidence_chronograms/apps.py deleted file mode 100644 index d40bb2d5..00000000 --- a/confidence_chronograms/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class ConfidenceChronogramsConfig(AppConfig): - name = 'confidence_chronograms' diff --git a/confidence_chronograms/forms.py b/confidence_chronograms/forms.py deleted file mode 100644 index c65eedd3..00000000 --- a/confidence_chronograms/forms.py +++ /dev/null @@ -1,28 +0,0 @@ - -from django import forms - -from .models import Funcionario, Cliente, Chronogram, Task - - -class FuncionarioForm(forms.ModelForm): - class Meta: - model = Funcionario - fields = ('nome', 'dt_nascimento', 'endereco', 'cep', 'uf', 'email', - 'fone1', 'usuario_fun') - -class ClienteForm(forms.ModelForm): - class Meta: - model = Cliente - fields = ('nome', 'razao_social', 'tipo_pessoa', 'cpf_cnpj', 'rg_ie', 'dt_nascimento', 'endereco', 'cep', 'uf', 'email', 'fone1', 'usuario_cli') - -class ChronogramForm(forms.ModelForm): - class Meta: - model = Chronogram - fields = ('construction', 'client', 'owner', 'address', - 'total_time', 'total_price', 'date_added', 'usuario') - -class TaskForm(forms.ModelForm): - class Meta: - model = Task - fields = ('ident', 'chronogram', 'name', 'task_text', 'start_date', 'duration', - 'end_date', 'progress', 'dependencies', 'price', 'date_added') \ No newline at end of file diff --git a/confidence_chronograms/templates/funcionario.html b/confidence_chronograms/templates/funcionario.html deleted file mode 100644 index e4178c0a..00000000 --- a/confidence_chronograms/templates/funcionario.html +++ /dev/null @@ -1,97 +0,0 @@ -{% extends "base-funcionario.html" %} - -{% block content %} -
-
-

Funcionário

-
{% csrf_token %} - -
- Dados do Funcionário -

- -

-

- -

-
- -
- Endereço -

- -

-

- -

-

- -

-

- -

- -
- - -
-
-
- - -{% endblock %} \ No newline at end of file diff --git a/confidencechronogram/__init__.py b/confidencechronogram/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/confidence_chronogram/asgi.py b/confidencechronogram/asgi.py similarity index 69% rename from confidence_chronogram/asgi.py rename to confidencechronogram/asgi.py index ceaad124..9576df18 100644 --- a/confidence_chronogram/asgi.py +++ b/confidencechronogram/asgi.py @@ -1,5 +1,5 @@ """ -ASGI config for confidence_chronogram project. +ASGI config for confidencechronogram project. It exposes the ASGI callable as a module-level variable named ``application``. @@ -11,6 +11,6 @@ from django.core.asgi import get_asgi_application -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'confidence_chronogram.settings') +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'confidencechronogram.settings') application = get_asgi_application() diff --git a/confidence_chronogram/settings.py b/confidencechronogram/settings.py similarity index 59% rename from confidence_chronogram/settings.py rename to confidencechronogram/settings.py index ef47e0c7..74a7cf22 100644 --- a/confidence_chronogram/settings.py +++ b/confidencechronogram/settings.py @@ -1,15 +1,3 @@ -""" -Django settings for confidence_chronogram project. - -Generated by 'django-admin startproject' using Django 3.0.2. - -For more information on this file, see -https://docs.djangoproject.com/en/3.0/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/3.0/ref/settings/ -""" - import os from decouple import config @@ -41,21 +29,26 @@ 'django.contrib.messages', 'django.contrib.staticfiles', #my apps - 'confidence_chronograms', - 'account', + 'apps.confidencechronograms', + 'apps.account', + "crispy_forms", + 'bootstrapform', ] +CRISPY_TEMPLATE_PACK = 'bootstrap4' + MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', + "django.middleware.security.SecurityMiddleware", + "whitenoise.middleware.WhiteNoiseMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", ] -ROOT_URLCONF = 'confidence_chronogram.urls' +ROOT_URLCONF = 'confidencechronogram.urls' TEMPLATES = [ { @@ -73,15 +66,28 @@ }, ] -WSGI_APPLICATION = 'confidence_chronogram.wsgi.application' +WSGI_APPLICATION = 'confidencechronogram.wsgi.application' # Database # https://docs.djangoproject.com/en/3.0/ref/settings/#databases -default_dburl = 'sqlite:///' + os.path.join(BASE_DIR, 'db.sqlite3') -DATABASES = { 'default': config('DATABASE_URL', default=default_dburl, cast=dburl), } +#default_dburl = 'sqlite:///' + os.path.join(BASE_DIR, 'db.sqlite3') +#DATABASES = { 'default': config('DATABASE_URL', default=default_dburl, cast=dburl), } + +DATABASES = { + "default": { + "ENGINE": "django.db.backends.mysql", + "NAME": "db_confidence", + "USER": "root", + "PASSWORD": "Ads_12345", + "HOST": "localhost", + "PORT": "3306", + "OPTIONS": {"init_command": "SET sql_mode='STRICT_TRANS_TABLES'",}, + } +} + # Password validation # https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators @@ -119,10 +125,26 @@ # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.0/howto/static-files/ -STATIC_URL = '/static/' +STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') +STATIC_TMP = os.path.join(BASE_DIR, "static") +STATIC_URL = "/static/" -STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') +os.makedirs(STATIC_TMP, exist_ok=True) +os.makedirs(STATIC_ROOT, exist_ok=True) + +STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")] + +MEDIA_ROOT = os.path.join(BASE_DIR, "media") + +MEDIA_URL = "/media/" + +LOGIN_REDIRECT_URL = '/' +LOGOUT_REDIRECT_URL = '/' +LOGIN_URL = '/confidencechronogram/' + +STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage' +#STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage" #Comentar django_heroku qndo for rodar localhost # import django_heroku diff --git a/confidencechronogram/urls.py b/confidencechronogram/urls.py new file mode 100644 index 00000000..98fcb099 --- /dev/null +++ b/confidencechronogram/urls.py @@ -0,0 +1,12 @@ +from django.contrib import admin +from django.urls import path, include +from django.conf.urls import url +from django.conf import settings +from django.conf.urls.static import static + +urlpatterns = [ + path('', include('apps.confidencechronograms.urls')), + path('admin/', admin.site.urls), + path('account/', include('apps.account.urls')), + #path('account/', include('django.contrib.auth.urls')), #para urls app_name = 'account' +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/confidencechronogram/wsgi.py b/confidencechronogram/wsgi.py new file mode 100644 index 00000000..e32240fe --- /dev/null +++ b/confidencechronogram/wsgi.py @@ -0,0 +1,9 @@ +import os + +from django.core.wsgi import get_wsgi_application + +from dj_static import Cling + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'confidencechronogram.settings') + +application = Cling(get_wsgi_application()) diff --git a/db.sqlite3 b/db.sqlite3 index cc8b0889..96f9eeb6 100644 Binary files a/db.sqlite3 and b/db.sqlite3 differ diff --git a/manage.py b/manage.py index dcc36505..78bd59b8 100755 --- a/manage.py +++ b/manage.py @@ -5,7 +5,7 @@ def main(): - os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'confidence_chronogram.settings') + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'confidencechronogram.settings') try: from django.core.management import execute_from_command_line except ImportError as exc: diff --git a/node_modules/frappe-gantt/README.md b/node_modules/frappe-gantt/README.md index 50ca4b5f..c3683fee 100644 --- a/node_modules/frappe-gantt/README.md +++ b/node_modules/frappe-gantt/README.md @@ -1,5 +1,5 @@
- +

Frappe Gantt

A simple, interactive, modern gantt chart library for the web

diff --git a/node_modules/frappe-gantt/package.json b/node_modules/frappe-gantt/package.json index 97ba7d8b..3dd34573 100755 --- a/node_modules/frappe-gantt/package.json +++ b/node_modules/frappe-gantt/package.json @@ -1,8 +1,8 @@ { "_from": "frappe-gantt", - "_id": "frappe-gantt@0.3.0", + "_id": "frappe-gantt@0.5.0", "_inBundle": false, - "_integrity": "sha512-19rJUJ6UfAN7LPHHhVtYjff0mdyat/mwMW+PAXp5s1211QZ4loi+TkuGgRY9n1r9xAI/VlGoYHUehHdYZge3aQ==", + "_integrity": "sha512-RAskVuBmnTcPJXh87oVhYmnNGy/9lvZlLHGui8QFB8yRBuUjzpZoZfZ+hKmDtBDmWNrE2/LRta06W5WmhTzzWQ==", "_location": "/frappe-gantt", "_phantomChildren": {}, "_requested": { @@ -19,10 +19,10 @@ "#USER", "/" ], - "_resolved": "https://registry.npmjs.org/frappe-gantt/-/frappe-gantt-0.3.0.tgz", - "_shasum": "0c718be2a5b5602be4ceb35ecc2093f9af59bea2", + "_resolved": "https://registry.npmjs.org/frappe-gantt/-/frappe-gantt-0.5.0.tgz", + "_shasum": "4dc7aa125f318efea64b4ae0e38f67a720238c1d", "_spec": "frappe-gantt", - "_where": "/home/cesar/confidence_chronogram", + "_where": "C:\\Users\\Cesar\\Documents\\confidence_chronogram", "author": { "name": "Faris Ansari" }, @@ -41,7 +41,7 @@ "jest": "^22.2.1", "prettier": "1.10.2", "rollup": "^0.55.3", - "rollup-plugin-sass": "^0.5.3", + "rollup-plugin-sass": "^1.2.2", "rollup-plugin-uglify": "^3.0.0" }, "eslintIgnore": [ @@ -71,5 +71,5 @@ "test": "jest", "test:watch": "jest --watch" }, - "version": "0.3.0" + "version": "0.5.0" } diff --git a/node_modules/frappe-gantt/src/bar.js b/node_modules/frappe-gantt/src/bar.js index 7e0868e4..c9240df0 100644 --- a/node_modules/frappe-gantt/src/bar.js +++ b/node_modules/frappe-gantt/src/bar.js @@ -181,24 +181,29 @@ export default class Bar { return; } - if (e.type === 'click') { - this.gantt.trigger_event('click', [this.task]); - } - + this.show_popup(); this.gantt.unselect_all(); - this.group.classList.toggle('active'); + this.group.classList.add('active'); + }); - this.show_popup(); + $.on(this.group, 'dblclick', e => { + if (this.action_completed) { + // just finished a move action, wait for a few seconds + return; + } + + this.gantt.trigger_event('click', [this.task]); }); } show_popup() { if (this.gantt.bar_being_dragged) return; - const start_date = date_utils.format(this.task._start, 'MMM D'); + const start_date = date_utils.format(this.task._start, 'MMM D', this.gantt.options.language); const end_date = date_utils.format( date_utils.add(this.task._end, -1, 'second'), - 'MMM D' + 'MMM D', + this.gantt.options.language ); const subtitle = start_date + ' - ' + end_date; @@ -206,7 +211,7 @@ export default class Bar { target_element: this.$bar, title: this.task.name, subtitle: subtitle, - task: this.task + task: this.task, }); } diff --git a/node_modules/frappe-gantt/src/date_utils.js b/node_modules/frappe-gantt/src/date_utils.js index 6b164ca4..a51feca2 100644 --- a/node_modules/frappe-gantt/src/date_utils.js +++ b/node_modules/frappe-gantt/src/date_utils.js @@ -21,6 +21,20 @@ const month_names = { 'November', 'December' ], + es: [ + 'Enero', + 'Febrero', + 'Marzo', + 'Abril', + 'Mayo', + 'Junio', + 'Julio', + 'Agosto', + 'Septiembre', + 'Octubre', + 'Noviembre', + 'Diciembre' + ], ru: [ 'Январь', 'Февраль', @@ -34,6 +48,62 @@ const month_names = { 'Октябрь', 'Ноябрь', 'Декабрь' + ], + ptBr: [ + 'Janeiro', + 'Fevereiro', + 'Março', + 'Abril', + 'Maio', + 'Junho', + 'Julho', + 'Agosto', + 'Setembro', + 'Outubro', + 'Novembro', + 'Dezembro' + ], + fr: [ + 'Janvier', + 'Février', + 'Mars', + 'Avril', + 'Mai', + 'Juin', + 'Juillet', + 'Août', + 'Septembre', + 'Octobre', + 'Novembre', + 'Décembre' + ], + tr: [ + 'Ocak', + 'Şubat', + 'Mart', + 'Nisan', + 'Mayıs', + 'Haziran', + 'Temmuz', + 'Ağustos', + 'Eylül', + 'Ekim', + 'Kasım', + 'Aralık' + ], + zh: [ + '一月', + '二月', + '三月', + '四月', + '五月', + '六月', + '七月', + '八月', + '九月', + '十月', + '十一月', + '十二月' ] }; diff --git a/node_modules/frappe-gantt/src/index.js b/node_modules/frappe-gantt/src/index.js index 209b3f0e..97770967 100644 --- a/node_modules/frappe-gantt/src/index.js +++ b/node_modules/frappe-gantt/src/index.js @@ -6,6 +6,15 @@ import Popup from './popup'; import './gantt.scss'; +const VIEW_MODE = { + QUARTER_DAY: 'Quarter Day', + HALF_DAY: 'Half Day', + DAY: 'Day', + WEEK: 'Week', + MONTH: 'Month', + YEAR: 'Year' +}; + export default class Gantt { constructor(wrapper, tasks, options) { this.setup_wrapper(wrapper); @@ -68,14 +77,7 @@ export default class Gantt { header_height: 50, column_width: 30, step: 24, - view_modes: [ - 'Quarter Day', - 'Half Day', - 'Day', - 'Week', - 'Month', - 'Year' - ], + view_modes: [...Object.values(VIEW_MODE)], bar_height: 20, bar_corner_radius: 3, arrow_curve: 5, @@ -180,22 +182,22 @@ export default class Gantt { update_view_scale(view_mode) { this.options.view_mode = view_mode; - if (view_mode === 'Day') { + if (view_mode === VIEW_MODE.DAY) { this.options.step = 24; this.options.column_width = 38; - } else if (view_mode === 'Half Day') { + } else if (view_mode === VIEW_MODE.HALF_DAY) { this.options.step = 24 / 2; this.options.column_width = 38; - } else if (view_mode === 'Quarter Day') { + } else if (view_mode === VIEW_MODE.QUARTER_DAY) { this.options.step = 24 / 4; this.options.column_width = 38; - } else if (view_mode === 'Week') { + } else if (view_mode === VIEW_MODE.WEEK) { this.options.step = 24 * 7; this.options.column_width = 140; - } else if (view_mode === 'Month') { + } else if (view_mode === VIEW_MODE.MONTH) { this.options.step = 24 * 30; this.options.column_width = 120; - } else if (view_mode === 'Year') { + } else if (view_mode === VIEW_MODE.YEAR) { this.options.step = 24 * 365; this.options.column_width = 120; } @@ -223,13 +225,13 @@ export default class Gantt { this.gantt_end = date_utils.start_of(this.gantt_end, 'day'); // add date padding on both sides - if (this.view_is(['Quarter Day', 'Half Day'])) { + if (this.view_is([VIEW_MODE.QUARTER_DAY, VIEW_MODE.HALF_DAY])) { this.gantt_start = date_utils.add(this.gantt_start, -7, 'day'); this.gantt_end = date_utils.add(this.gantt_end, 7, 'day'); - } else if (this.view_is('Month')) { + } else if (this.view_is(VIEW_MODE.MONTH)) { this.gantt_start = date_utils.start_of(this.gantt_start, 'year'); this.gantt_end = date_utils.add(this.gantt_end, 1, 'year'); - } else if (this.view_is('Year')) { + } else if (this.view_is(VIEW_MODE.YEAR)) { this.gantt_start = date_utils.add(this.gantt_start, -2, 'year'); this.gantt_end = date_utils.add(this.gantt_end, 2, 'year'); } else { @@ -246,9 +248,9 @@ export default class Gantt { if (!cur_date) { cur_date = date_utils.clone(this.gantt_start); } else { - if (this.view_is('Year')) { + if (this.view_is(VIEW_MODE.YEAR)) { cur_date = date_utils.add(cur_date, 1, 'year'); - } else if (this.view_is('Month')) { + } else if (this.view_is(VIEW_MODE.MONTH)) { cur_date = date_utils.add(cur_date, 1, 'month'); } else { cur_date = date_utils.add( @@ -377,19 +379,19 @@ export default class Gantt { for (let date of this.dates) { let tick_class = 'tick'; // thick tick for monday - if (this.view_is('Day') && date.getDate() === 1) { + if (this.view_is(VIEW_MODE.DAY) && date.getDate() === 1) { tick_class += ' thick'; } // thick tick for first week if ( - this.view_is('Week') && + this.view_is(VIEW_MODE.WEEK) && date.getDate() >= 1 && date.getDate() < 8 ) { tick_class += ' thick'; } // thick ticks for quarters - if (this.view_is('Month') && (date.getMonth() + 1) % 3 === 0) { + if (this.view_is(VIEW_MODE.MONTH) && (date.getMonth() + 1) % 3 === 0) { tick_class += ' thick'; } @@ -399,7 +401,7 @@ export default class Gantt { append_to: this.layers.grid }); - if (this.view_is('Month')) { + if (this.view_is(VIEW_MODE.MONTH)) { tick_x += date_utils.get_days_in_month(date) * this.options.column_width / @@ -412,7 +414,7 @@ export default class Gantt { make_grid_highlights() { // highlight today's date - if (this.view_is('Day')) { + if (this.view_is(VIEW_MODE.DAY)) { const x = date_utils.diff(date_utils.today(), this.gantt_start, 'hour') / this.options.step * @@ -817,7 +819,7 @@ export default class Gantt { rem, position; - if (this.view_is('Week')) { + if (this.view_is(VIEW_MODE.WEEK)) { rem = dx % (this.options.column_width / 7); position = odx - @@ -825,7 +827,7 @@ export default class Gantt { (rem < this.options.column_width / 14 ? 0 : this.options.column_width / 7); - } else if (this.view_is('Month')) { + } else if (this.view_is(VIEW_MODE.MONTH)) { rem = dx % (this.options.column_width / 30); position = odx - @@ -920,6 +922,8 @@ export default class Gantt { } } +Gantt.VIEW_MODE = VIEW_MODE; + function generate_id(task) { return ( task.name + diff --git a/package-lock.json b/package-lock.json index 999bda41..de6e1c72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3,9 +3,9 @@ "lockfileVersion": 1, "dependencies": { "frappe-gantt": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/frappe-gantt/-/frappe-gantt-0.3.0.tgz", - "integrity": "sha512-19rJUJ6UfAN7LPHHhVtYjff0mdyat/mwMW+PAXp5s1211QZ4loi+TkuGgRY9n1r9xAI/VlGoYHUehHdYZge3aQ==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/frappe-gantt/-/frappe-gantt-0.5.0.tgz", + "integrity": "sha512-RAskVuBmnTcPJXh87oVhYmnNGy/9lvZlLHGui8QFB8yRBuUjzpZoZfZ+hKmDtBDmWNrE2/LRta06W5WmhTzzWQ==" } } } diff --git a/runtime.txt b/runtime.txt index 724c203e..a01373a3 100644 --- a/runtime.txt +++ b/runtime.txt @@ -1 +1 @@ -python-3.8.2 +python-3.7.2