diff --git a/sapl/painel/views.py b/sapl/painel/views.py index 1dcb7bb49..1413da8e5 100644 --- a/sapl/painel/views.py +++ b/sapl/painel/views.py @@ -132,6 +132,7 @@ def votacao(context,context_vars): 'Ordem do Dia/Expediente em votação.'}) return context, context_vars + def sessao_votacao(context,context_vars): pk = context_vars['sessao'].pk context.update({'sessao_id': pk}) diff --git a/sapl/templates/videoconf/layouts.yaml b/sapl/templates/videoconf/layouts.yaml new file mode 100644 index 000000000..3de12b5ad --- /dev/null +++ b/sapl/templates/videoconf/layouts.yaml @@ -0,0 +1,6 @@ +{% load i18n %} + +Videoconferencia: + {% trans 'Videoconferência' %}: + - titulo finalizada + - descricao \ No newline at end of file diff --git a/sapl/templates/videoconf/videoconferencia.html b/sapl/templates/videoconf/videoconferencia.html index 96ec59141..49022e6da 100644 --- a/sapl/templates/videoconf/videoconferencia.html +++ b/sapl/templates/videoconf/videoconferencia.html @@ -9,30 +9,35 @@ Videoconferência -

Vídeoconferência

+
+

Título: {{ object.titulo }}

+

Descrição: {{ object.descricao }}

+ ID: {{ object.chat_id }}
+
\ No newline at end of file diff --git a/sapl/templates/videoconf/videoconferencia_detail.html b/sapl/templates/videoconf/videoconferencia_detail.html new file mode 100644 index 000000000..dfc7bc369 --- /dev/null +++ b/sapl/templates/videoconf/videoconferencia_detail.html @@ -0,0 +1,9 @@ +{% extends "crud/detail.html" %} +{% load i18n common_tags %} +{% load render_bundle from webpack_loader %} + + +{% block detail_content %} + {{block.super}} + Link da sessão de vídeo +{% endblock detail_content %} \ No newline at end of file diff --git a/sapl/videoconf/forms.py b/sapl/videoconf/forms.py new file mode 100644 index 000000000..b9611cb22 --- /dev/null +++ b/sapl/videoconf/forms.py @@ -0,0 +1,65 @@ +import logging + +from django.forms import ModelForm +from django.utils.translation import ugettext_lazy as _ + +from sapl.videoconf.models import Videoconferencia + + +class VideoconferenciaForm(ModelForm): + + logger = logging.getLogger(__name__) + + class Meta: + model = Videoconferencia + fields = ['chat_id', 'descricao'] + + +# class AutoriaNormaForm(ModelForm): +# +# tipo_autor = ModelChoiceField(label=_('Tipo Autor'), +# required=False, +# queryset=TipoAutor.objects.all(), +# empty_label=_('Selecione'), ) +# +# data_relativa = forms.DateField( +# widget=forms.HiddenInput(), required=False) +# +# logger = logging.getLogger(__name__) +# +# def __init__(self, *args, **kwargs): +# super(AutoriaNormaForm, self).__init__(*args, **kwargs) +# +# row1 = to_row([('tipo_autor', 4), +# ('autor', 4), +# ('primeiro_autor', 4)]) +# +# self.helper = SaplFormHelper() +# self.helper.layout = Layout( +# Fieldset(_('Autoria'), +# row1, 'data_relativa', form_actions(label='Salvar'))) +# +# if not kwargs['instance']: +# self.fields['autor'].choices = [] +# +# class Meta: +# model = AutoriaNorma +# fields = ['tipo_autor', 'autor', 'primeiro_autor', 'data_relativa'] +# +# def clean(self): +# cd = super(AutoriaNormaForm, self).clean() +# +# if not self.is_valid(): +# return self.cleaned_data +# +# autorias = AutoriaNorma.objects.filter( +# norma=self.instance.norma, autor=cd['autor']) +# pk = self.instance.pk +# +# if ((not pk and autorias.exists()) or +# (pk and autorias.exclude(pk=pk).exists())): +# self.logger.error( +# "Autor ({}) já foi cadastrado.".format(cd['autor'])) +# raise ValidationError(_('Esse Autor já foi cadastrado.')) +# +# return cd \ No newline at end of file diff --git a/sapl/videoconf/migrations/0001_initial.py b/sapl/videoconf/migrations/0001_initial.py new file mode 100644 index 000000000..fa5a655d4 --- /dev/null +++ b/sapl/videoconf/migrations/0001_initial.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.29 on 2020-03-31 21:34 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import sapl.videoconf.models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Videoconferencia', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('chat_id', models.CharField(default=sapl.videoconf.models.gen_session_id, max_length=100, verbose_name='Chat ID')), + ('titulo', models.CharField(max_length=100, verbose_name='Título')), + ('descricao', models.CharField(blank=True, max_length=256, verbose_name='Descrição')), + ('inicio', models.DateTimeField(auto_now=True, verbose_name='Data e Hora de Início')), + ('termino', models.DateTimeField(blank=True, null=True, verbose_name='Data e Hora de Término')), + ('finalizada', models.BooleanField(default=False, verbose_name='Finalizada?')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Criado por')), + ], + options={ + 'verbose_name': 'Videoconferência', + 'verbose_name_plural': 'Videoconferências', + 'ordering': ['chat_id', 'descricao'], + }, + ), + ] diff --git a/sapl/videoconf/models.py b/sapl/videoconf/models.py index 71a836239..eeef2ba73 100644 --- a/sapl/videoconf/models.py +++ b/sapl/videoconf/models.py @@ -1,3 +1,41 @@ +from django.utils import timezone + from django.db import models +from django.utils.translation import ugettext_lazy as _ + +from sapl.utils import get_settings_auth_user_model + + +def gen_session_id(): + + from random import choice + return ''.join([str(choice(range(10))) for _ in range(25)]) + + +class Videoconferencia(models.Model): + + chat_id = models.CharField(max_length=100, + default=gen_session_id, + verbose_name=_('Chat ID')) + titulo = models.CharField(max_length=100, verbose_name=_('Título')) + descricao = models.CharField(max_length=256, blank=True, + verbose_name=_('Descrição')) + inicio = models.DateTimeField(auto_now=timezone.now, verbose_name=_('Data e Hora de Início')) + + #TODO: preencher quando usuário selecionar a opção 'finalizada' + termino = models.DateTimeField(blank=True, null=True, + verbose_name=_('Data e Hora de Término')) + finalizada = models.BooleanField(default=False, verbose_name=_('Finalizada?')) + + #TODO: obrigatório com preenchimento automatico + created_by = models.ForeignKey(get_settings_auth_user_model(), + blank=True, null=True, + verbose_name=_('Criado por')) + + class Meta: + verbose_name = _('Videoconferência') + verbose_name_plural = _('Videoconferências') + ordering = ['chat_id', 'descricao'] -# Create your models here. + def __str__(self): + return "".format(self.chat_id) diff --git a/sapl/videoconf/urls.py b/sapl/videoconf/urls.py index bd55599c4..bd2adb880 100644 --- a/sapl/videoconf/urls.py +++ b/sapl/videoconf/urls.py @@ -1,10 +1,13 @@ from .apps import AppConfig -from .views import VideoConferenciaView -from django.conf.urls import url +from .views import ChatView, VideoConferenciaCrud +from django.conf.urls import include, url app_name = AppConfig.name urlpatterns = [ - url(r'^videoconf/$', VideoConferenciaView.as_view(), name='videoconferencia'), + url(r'^videoconferencia/chat/(?P[0-9]+)$', + ChatView.as_view(), name='chat-session'), + url(r'^videoconferencia/', + include(VideoConferenciaCrud.get_urls()), name='videoconferencia'), ] diff --git a/sapl/videoconf/views.py b/sapl/videoconf/views.py index 984cfbffc..624b49e70 100644 --- a/sapl/videoconf/views.py +++ b/sapl/videoconf/views.py @@ -1,14 +1,58 @@ -from django.shortcuts import render -from django.views.generic import TemplateView +import logging + from django.contrib.auth.mixins import PermissionRequiredMixin +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist +from django.core.urlresolvers import reverse, reverse_lazy +from django.views.generic import TemplateView -# Create your views here. +from sapl.base.models import Autor +from sapl.crud.base import CrudAux +from sapl.parlamentares.models import Parlamentar +from sapl.videoconf.models import Videoconferencia +VideoConferenciaCrud = CrudAux.build(Videoconferencia, 'videoconferencia') -class VideoConferenciaView(PermissionRequiredMixin, TemplateView): + +class ChatView(PermissionRequiredMixin, TemplateView): template_name = "videoconf/videoconferencia.html" permission_required = ('sessao.add_sessao', ) + logger = logging.getLogger(__name__) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) + try: + context['object'] = Videoconferencia.objects.get(id=kwargs['pk']) + except ObjectDoesNotExist: + pass #TODO: return error + + user = self.request.user + content_type = ContentType.objects.get_for_model(Parlamentar) + try: + autor = user.autor + nome = autor.nome + parlamentar = None + if not autor.object_id or autor.content_type != content_type: + is_parlamentar = False + else: + try: + parlamentar = Parlamentar.objects.get(id=autor.object_id) + nome = parlamentar.nome_parlamentar + is_parlamentar = True + except ObjectDoesNotExist: + is_parlamentar = False + + user_data = { + 'nome': nome, + 'is_autor': True, + 'is_parlamentar': is_parlamentar, + 'parlamentar': parlamentar + } + except: + user_data = { + 'nome': user.username, + 'is_autor': False, + 'is_parlamentar': False + } + context.update(user_data) return context