Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

novas funcionalidades de tico e nanda #47

Merged
merged 5 commits into from
Jun 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions conecta-cesar/app_cc/migrations/0009_like_post_curtidas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 5.0.5 on 2024-06-23 18:05

import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('app_cc', '0008_post'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name='Like',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('data_criacao', models.DateTimeField(auto_now_add=True)),
('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app_cc.post')),
('usuario', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'unique_together': {('usuario', 'post')},
},
),
migrations.AddField(
model_name='post',
name='curtidas',
field=models.ManyToManyField(related_name='curtidas_post', through='app_cc.Like', to=settings.AUTH_USER_MODEL),
),
]
28 changes: 25 additions & 3 deletions conecta-cesar/app_cc/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,14 +228,36 @@ class Post(models.Model):
corpo = models.TextField()
publicado_em = models.DateTimeField(default=timezone.now)
pdf = models.FileField(upload_to="forum_pdfs/", null=True, blank=True)
curtidas = models.ManyToManyField(User, through='Like', related_name='curtidas_post')

def delete(self, *args, **kwargs):
# Exclui o arquivo do sistema de arquivos
if self.pdf:
self.pdf.delete(save=False)
super(Post, self).delete(*args, **kwargs) # Chama o método delete original para excluir o objeto do banco de dados
super(Post, self).delete(*args, **kwargs)

def __str__(self):
return f"{self.titulo} por {self.autor.username} em {self.publicado_em.strftime('%Y-%m-%d %H:%M')}"

def curtir(self, user):
like, created = Like.objects.get_or_create(usuario=user, post=self)
if not created:
like.delete()
return False
return True

def total_curtidas(self):
return self.curtidas.count()

class Meta:
ordering = ['-publicado_em']

class Like(models.Model):
usuario = models.ForeignKey(User, on_delete=models.CASCADE)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
data_criacao = models.DateTimeField(auto_now_add=True)

class Meta:
ordering = ['-publicado_em']
unique_together = ('usuario', 'post')

def __str__(self):
return f'{self.usuario.username} curtiu {self.post.titulo}'
28 changes: 28 additions & 0 deletions conecta-cesar/app_cc/templates/app_cc/aluno/forum.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,14 @@
{% load i18n %}
{% load static %}
{% block content %}

<link rel="stylesheet" href="{% static 'css/forum.css' %}" type="text/css">
<link rel="stylesheet" href="{% static 'css/style.css' %}" type="text/css">
<link rel="stylesheet" href="{% static 'css/buttons.css' %}" type="text/css">



<body>
<h1 class="text-center">Fórum</h1>
{% if messages %} <div> {% for message in messages %} <div class="alert alert-{% if 'success' in message.tags %}success{% elif 'error' in message.tags %}danger{% elif 'warning' in message.tags %}warning{% else %}info{% endif %} fade show" role="alert"> {{ message }} </div> {% endfor %} </div> {% endif %}

Expand Down Expand Up @@ -51,13 +56,36 @@ <h3>{{ post.titulo }}</h3>
</div>
</button>
</form>
{% endif %}
{% if user.is_authenticated and post.autor != user %}
<div class="like-container">
<form action="{% url 'curtir_post' post.id %}" method="post">
<input type="hidden" name="post_id" value="{{ post.id }}">
<button class="like-button" type="submit">
<div class="svg-wrapper-1">
<div class="svg-wrapper">
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="bi bi-heart" viewBox="0 0 16 16">
<path d="M8 14s-6-3.5-6-7a4 4 0 0 1 6-3.464A4 4 0 0 1 14 7c0 3.5-6 7-6 7z"/>
</svg>
</div>
</div>
</button>
</form>

<span class="likes-count">{{ post.total_curtidas }}</span>
</div>
{% endif %}
{% if user.is_authenticated and post.autor == user %}
<span class="likes-count">Total de curtidas: {{ post.total_curtidas }}</span>
{% endif %}
<small>Postado por: {{ post.autor.username }}, em {{ post.publicado_em|date:"d/m/Y H:i" }}</small>

</div>
{% empty %}
<div class="vazio">
<p class="text-center">Nenhum post foi encontrado.</p>
</div>
{% endfor %}
</div>
</body>
{% endblock %}
2 changes: 1 addition & 1 deletion conecta-cesar/app_cc/templates/app_cc/aluno/todo_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ <h2>{{ todo_list.title }}</h2>
{% for item in todo_list.items.all %}
<li class="todo-item">
{{ item.content }}
<a href="{% url 'delete_todo_item' item.id %}" class="todo-action">Deletar Item</a>
<a href="{% url 'delete_todo_item' item.id %}" class="todo-action">Item Concluído</a>
</li>
{% endfor %}
</ul>
Expand Down
7 changes: 4 additions & 3 deletions conecta-cesar/app_cc/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
path('aluno/avisos/<int:aviso_id>/', views.detalhe_aviso, name='detalhe_aviso'),
path('aluno/forum_novo/', views.create_post, name='create_post'),
path('apagar_post/<int:post_id>/', views.apagar_post, name='apagar_post'),
path('post/<int:post_id>/curtir/', views.curtir_post, name='curtir_post'),
path('aluno/forum/', views.forum_view, name='forum'),
path('aluno/boletim/', views.boletim, name='boletim'),
path('aluno/frequencia/', views.frequencia, name='frequencia'),
Expand All @@ -16,9 +17,9 @@
path('aluno/variacao_notas/', views.variacao_notas, name='variacao_notas'),
path('aluno/hora_extra/', views.hora_extra, name='hora_extra'),
path('aluno/slides/', views.slides, name="slides"),
path('aluno/todo/', views.todo_list_view, name='todo_list'),
path('aluno/create/', views.create_todo_list, name='create_todo_list'),
path('todo/<int:list_id>/add/', views.add_todo_item, name='add_todo_item'),
path('todo/', views.todo_list_view, name='todo_list'),
path('todo/create/', views.create_todo_list, name='create_todo_list'),
path('todo/<int:list_id>/add_item/', views.add_todo_item, name='add_todo_item'),
path('todo/<int:list_id>/delete/', views.delete_todo_list, name='delete_todo_list'),
path('todo/item/<int:item_id>/delete/', views.delete_todo_item, name='delete_todo_item'),
path('aluno/vocorrencias/', views.vocorrencias, name='vocorrencias'),
Expand Down
29 changes: 19 additions & 10 deletions conecta-cesar/app_cc/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from django.shortcuts import render, redirect, get_object_or_404
from django.urls import reverse
from .models import Post, Review, Disciplina, Nota, Diario, Professor as ProfessorModel, Aluno as AlunoModel, Falta, File, Evento, Aviso, Relatorio, ProfessorFile, Turma
from .models import Like, Post, Review, Disciplina, Nota, Diario, Professor as ProfessorModel, Aluno as AlunoModel, Falta, File, Evento, Aviso, Relatorio, ProfessorFile, Turma
from rolepermissions.checkers import has_role
from project_cc.roles import Professor, Aluno
from django.contrib import messages
Expand Down Expand Up @@ -785,8 +785,10 @@ def boletimp(request):
{'disciplinas_com_turmas_e_alunos': disciplinas_com_turmas_e_alunos}
)

@login_required
def todo_list_view(request):
todo_lists = ToDoList.objects.all() # Exemplo de obtenção de listas de tarefas
user = request.user
todo_lists = ToDoList.objects.filter(user=user)
return render(request, 'app_cc/aluno/todo_list.html', {'todo_lists': todo_lists})

@login_required
Expand All @@ -799,29 +801,26 @@ def create_todo_list(request):
return redirect('todo_list') # Redireciona para a lista de tarefas após a criação
else:
form = ToDoListForm()

return render(request, 'app_cc/aluno/create_todo_list.html', {'form': form})


@login_required
def add_todo_item(request, list_id):
todo_list = get_object_or_404(ToDoList, id=list_id)
todo_list = get_object_or_404(ToDoList, id=list_id, user=request.user)
if request.method == 'POST':
content = request.POST.get('content')
ToDoItem.objects.create(todo_list=todo_list, content=content)
return redirect('todo_list')
return render(request, 'app_cc/aluno/add_todo_item.html', {'todo_list': todo_list})


@login_required
def delete_todo_list(request, list_id):
todo_list = get_object_or_404(ToDoList, id=list_id)
todo_list = get_object_or_404(ToDoList, id=list_id, user=request.user)
todo_list.delete()
return redirect('todo_list')

@login_required
def delete_todo_item(request, item_id):
item = get_object_or_404(ToDoItem, id=item_id)
item = get_object_or_404(ToDoItem, id=item_id, todo_list__user=request.user)
item.delete()
return redirect('todo_list')

Expand Down Expand Up @@ -875,7 +874,7 @@ def create_post(request):
autor = User.objects.get(id=autor_id)
Post.objects.create(titulo=titulo, corpo=corpo, autor=autor, publicado_em=publicado_em, pdf=pdf)
messages.success(request, 'Post criado com sucesso.')
return redirect('forum') # Substitua 'forum_novo' pelo nome da sua URL de listagem de posts
return redirect('forum')
else:
messages.error(request, 'Erro ao criar o post. Por favor, preencha todos os campos.')

Expand All @@ -889,4 +888,14 @@ def apagar_post(request, post_id):
messages.success(request, 'Post apagado com sucesso.')
else:
messages.error(request, 'Você não tem permissão para apagar este post.')
return redirect('forum') # Substitua 'forum' pelo nome da sua URL de listagem de posts
return redirect('forum')

@login_required
def curtir_post(request, post_id):
post = get_object_or_404(Post, id=post_id)
if post.curtir(request.user):
pass
else:
pass
return redirect('forum')

Binary file modified conecta-cesar/db.sqlite3
Binary file not shown.
Binary file not shown.
Binary file not shown.
54 changes: 54 additions & 0 deletions conecta-cesar/static/css/buttons.css
Original file line number Diff line number Diff line change
@@ -1,6 +1,60 @@
/*BUTTONS*/
.like-button {
width: 40px;
height: 40px;
color: white;
border-radius: 50%;
background-color: rgb(226, 34, 34);
border: none;
font-weight: 600;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.164);
cursor: pointer;
transition-duration: 0.3s;
overflow: hidden;
position: relative;
transition: background-color 0.3s;
}
.like-svgIcon {
width: 17px;
transition-duration: 0.3s;
}

.like-svgIcon path {
fill: white;
}
.like-button:hover .edit-svgIcon {
width: 20px;
transition-duration: 0.3s;
transform: translateY(60%);

}
.like-button::before {
display: none;
content: "Curtir";
color: white;
transition-duration: 0.3s;
font-size: 2px;
}

.like-button:hover {
width: 120px;
border-radius: 50px;
transition-duration: 0.3s;
align-items: center;
}

.like-button:hover::before {
display: block;
padding-right: 10px;
font-size: 13px;
opacity: 1;
transform: translateY(0px);
transition-duration: 0.3s;
}
/*delete*/
.delete-button {
width: 40px;
height: 40px;
Expand Down
13 changes: 13 additions & 0 deletions conecta-cesar/static/css/forum.css
Original file line number Diff line number Diff line change
Expand Up @@ -107,4 +107,17 @@ h1 {
margin-left: 25%;
margin-right: 25%;
border-radius: 5px;
}
.like-container {
display: flex;
align-items: center;
gap: 10px;
}

.likes-count {
font-size: 16px;
color: #e6e2e29f;
font-weight: bold;
display: flex;
align-items: center;
}
Loading