Skip to content

Commit

Permalink
feat: gerenc user
Browse files Browse the repository at this point in the history
  • Loading branch information
michelebswm committed Sep 26, 2023
1 parent e54efe0 commit 99e4879
Show file tree
Hide file tree
Showing 34 changed files with 291 additions and 66 deletions.
Binary file modified db.sqlite3
Binary file not shown.
13 changes: 12 additions & 1 deletion filme/admin.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,17 @@
from django.contrib import admin
from .models import Filme, Episodio
from .models import Filme, Episodio, Usuario
from django.contrib.auth.admin import UserAdmin

# Os campos do UserAdmin são tuplas, desta forma transformei em lista python para incluir o novo campo
# de filmes vistos.
campos = list(UserAdmin.fieldsets)
campos.append(
("Histórico", {'fields': ('filmes_vistos',)})
)

UserAdmin.fieldsets = tuple(campos)

# Register your models here.
admin.site.register(Filme)
admin.site.register(Episodio)
admin.site.register(Usuario, UserAdmin)
46 changes: 43 additions & 3 deletions filme/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
# Generated by Django 4.2.5 on 2023-09-06 01:07
# Generated by Django 4.2.5 on 2023-09-24 16:11

import django.contrib.auth.models
import django.contrib.auth.validators
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone


Expand All @@ -9,19 +12,56 @@ class Migration(migrations.Migration):
initial = True

dependencies = [
('auth', '0012_alter_user_first_name_max_length'),
]

operations = [
migrations.CreateModel(
name='filme',
name='Filme',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('titulo', models.CharField(max_length=100)),
('thumb', models.ImageField(upload_to='thumb_filmes')),
('descricao', models.TextField(max_length=1000)),
('categoria', models.CharField(choices=[('ANALISES', 'Análises'), ('PROGRAMACAO', 'Programação'), ('APRESENTACAO', 'Apresentação'), ('OUTROS', 'Outros')], max_length=15)),
('categoria', models.CharField(choices=[('ANALISES', 'Análises'), ('PROGRAMACAO', 'Programação'), ('APRESENTACAO', 'Apresentação'), ('OUTROS', 'Outros'), {'ANIMES', 'Animes'}], max_length=15)),
('visualizacoes', models.IntegerField(default=0)),
('data_criacao', models.DateTimeField(default=django.utils.timezone.now)),
],
),
migrations.CreateModel(
name='Episodio',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('titulo', models.CharField(max_length=100)),
('video', models.URLField()),
('filme', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='episodios', to='filme.filme')),
],
),
migrations.CreateModel(
name='Usuario',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('filmes_vistos', models.ManyToManyField(to='filme.filme')),
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')),
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')),
],
options={
'verbose_name': 'user',
'verbose_name_plural': 'users',
'abstract': False,
},
managers=[
('objects', django.contrib.auth.models.UserManager()),
],
),
]
28 changes: 0 additions & 28 deletions filme/migrations/0002_alter_filme_categoria_episodio.py

This file was deleted.

13 changes: 7 additions & 6 deletions filme/models.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import AbstractUser


LISTA_CATEGORIAS = (
('ANALISES', 'Análises'),
('PROGRAMACAO', 'Programação'),
('APRESENTACAO', 'Apresentação'),
('OUTROS', 'Outros'),
{'ANIMES', 'Animes'}
{'ANIMES', 'Animes'},
['FILME_A', 'Filme de Ação'],
)

# Create o film


class Filme(models.Model):
titulo = models.CharField(max_length=100)
Expand All @@ -26,8 +27,6 @@ class Filme(models.Model):
def __str__(self):
return self.titulo

# Criar os episódios


class Episodio(models.Model):
# parametos do ForeignKey, "nome_da_tabela", related_name relaciona os episodios ao filme, on_delete se deletar o filme os episodios também sao deletados
Expand All @@ -39,4 +38,6 @@ class Episodio(models.Model):
def __str__(self):
return self.filme.titulo + ' - ' + self.titulo

# Criar o usuário

class Usuario(AbstractUser):
filmes_vistos = models.ManyToManyField('Filme')
9 changes: 9 additions & 0 deletions filme/novos_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,12 @@ def lista_filmes_recentes(request):
def lista_filmes_emalta(request):
lista_filmes = Filme.objects.all().order_by('-visualizacoes')[0:10]
return {"lista_filmes_emalta": lista_filmes}


def filme_destaque(request):
filme = Filme.objects.order_by('-data_criacao')
if filme:
filme = filme[0]
else:
filme = None
return {"filme_destaque": filme}
39 changes: 26 additions & 13 deletions filme/templates/homefilmes.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,15 @@

{% block content %}
<div class="content">
<h1>Esta é a HomeFilmes</h1>

<!-- {% for filme in object_list %}
<a href="{% url 'filme:detalhesfilme' filme.pk %}"><p>{{ filme.titulo }}</p></a>
<hr>
<p>{{ filme.descricao }}</p>
<img src="{{ filme.thumb.url }}" alt="">
{% endfor %} -->

<section class="sec-filme" style="background-image: url('{{ object.thumb.url }}');">
<section class="sec-filme" style="background-image: url('{{ filme_destaque.thumb.url }}');">
<div class="title-film">
{{ object.titulo }}
{{ filme_destaque.titulo }}
</div>
<div class="description-resume">
{{ object.descricao }}
{{ filme_destaque.descricao }}
</div>
<div class="btn-play">
<a href="{{ object.episodios.first.video }}">Play</a>
<a href="{% url 'filme:detalhesfilme' filme_destaque.pk %}">Play</a>
</div>
<!-- <img src="{{ object.thumb.url }}" alt=""> -->
</section>
Expand Down Expand Up @@ -78,6 +69,28 @@ <h1>Esta é a HomeFilmes</h1>
</div>
</div>
</section>

<section class="sec-assistidos">
<div class="subtitle">Filmes Vistos</div>
<div class="container">
<button class="arrow-left3 control3" aria-label="Previous image">
</button>
<button class="arrow-right control3" aria-label="Next image">
</button>
<div class="gallery-wrapper">
<div class="gallery">
{% for filme in request.user.filmes_vistos.all %}
<a href="{% url 'filme:detalhesfilme' filme.pk %}">
<img src="{{ filme.thumb.url }}" alt="" class="item3">
<p class="text-list">{{ filme.titulo }}</p>
</a>
{% endfor %}
</div>
</div>
</div>
</section>
</div>
<script src="{% static 'js/carousel.js'%}" charset="utf-8"></script>

Expand Down
16 changes: 16 additions & 0 deletions filme/templates/login.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{% extends 'base.html' %}

{% block title %}
Login Hashflix
{% endblock %}

{% block head %}
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'css/style_login.css' %}"/>
{% endblock %}

{% block content %}
<div class="content">
<h2>Login</h2>
</div>
{% endblock %}
16 changes: 16 additions & 0 deletions filme/templates/logout.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{% extends 'base.html' %}

{% block title %}
Logout Hashflix
{% endblock %}

{% block head %}
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'css/style_logout.css' %}"/>
{% endblock %}

{% block content %}
<div class="content">
<h2>Logout</h2>
</div>
{% endblock %}
26 changes: 26 additions & 0 deletions filme/templates/pesquisa.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{% extends 'base.html' %}

{% block title %}
Pesquisa de Filmes
{% endblock %}

{% block head %}
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'css/style_pesquisa.css' %}"/>
{% endblock %}

{% block content %}
<div class="content">
<h2>Resultados da busca</h2>
<div class="search">
{% for filme in object_list %}
<div class="search-item">
<a href="{% url 'filme:detalhesfilme' filme.pk %}">
<img src="{{ filme.thumb.url }}" alt="" class="item">
<p class="text-list">{{ filme.titulo }}</p>
</a>
</div>
{% endfor %}
</div>
</div>
{% endblock %}
8 changes: 7 additions & 1 deletion filme/urls.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from django.urls import path, include
from .views import Homepage, HomeFilmes, DetalhesFilme
from .views import Homepage, HomeFilmes, DetalhesFilme, PesquisaFilme
from django.contrib.auth import views as auth_view


app_name = 'filme'
Expand All @@ -9,4 +10,9 @@
path('', Homepage.as_view(), name='homepage'),
path('filmes/', HomeFilmes.as_view(), name='homefilmes'),
path('filmes/<int:pk>', DetalhesFilme.as_view(), name='detalhesfilme'),
path('pesquisa', PesquisaFilme.as_view(), name='pesquisafilme'),
path('login', auth_view.LoginView.as_view(
template_name='login.html'), name='login'),
path('logout', auth_view.LogoutView.as_view(
template_name='logout.html'), name='logout'),
]
31 changes: 25 additions & 6 deletions filme/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.shortcuts import render
from .models import Filme
from django.views.generic import TemplateView, ListView, DetailView
from django.contrib.auth.mixins import LoginRequiredMixin

# Create your views here.

Expand All @@ -9,21 +10,21 @@ class Homepage(TemplateView):
template_name = 'homepage.html'


class HomeFilmes(ListView):
class HomeFilmes(LoginRequiredMixin, ListView):
template_name = "homefilmes.html"
model = Filme


class DetalhesFilme(DetailView):
class DetalhesFilme(LoginRequiredMixin, DetailView):
template_name = "detalhesfilme.html"
model = Filme

def get(self, request, *args, **kwargs):
# Descobrir o filme acessado, Somar 1 nas visualizações do filme e atualizar no banco
filme = self.get_object()
filme.visualizacoes += 1 # Editando o campo do banco de dados
filme.save() # Salvando a atualização no banco de dados

filme.visualizacoes += 1
filme.save()
usuario = request.user # current user
usuario.filmes_vistos.add(filme) # .add para adicionar no banco
# Redireciona o usuário para a url final
return super().get(request, *args, **kwargs)

Expand All @@ -36,6 +37,24 @@ def get_context_data(self, **kwargs):
context['filmes_relacionados'] = filmes_relacionados
return context


class PesquisaFilme(LoginRequiredMixin, ListView):
template_name = "pesquisa.html"
model = Filme

# Alterando o object_list

def get_queryset(self):
# Quando for feita uma pesquisa quero pegar o termo digitado
termo_pesquisa = self.request.GET.get(
'query') # é o name do input da pesquisa
if termo_pesquisa:
object_list = self.model.objects.filter(
titulo__icontains=termo_pesquisa)
return object_list
else:
return None

# def homepage(request):
# return render(request, "homepage.html")

Expand Down
8 changes: 7 additions & 1 deletion hashflix/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
'django.contrib.messages.context_processors.messages',
'filme.novos_context.lista_filmes_recentes',
'filme.novos_context.lista_filmes_emalta',
'filme.novos_context.filme_destaque',
],
},
},
Expand All @@ -87,7 +88,7 @@

# Password validation
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators

AUTH_USER_MODEL = 'filme.Usuario'
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
Expand Down Expand Up @@ -138,3 +139,8 @@
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

# Gerenciamento de Users
LOGIN_REDIRECT_URL = 'filme:homefilmes'

LOGIN_URL = 'filme:login'
Binary file not shown.
Binary file added media/thumb_filmes/JOGADOR1.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added media/thumb_filmes/blackclover.jpe
Binary file not shown.
Binary file added media/thumb_filmes/blackclover_Es5ps7i.jpe
Binary file not shown.
Binary file modified media/thumb_filmes/deathnote.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed media/thumb_filmes/deathnote_ydWhu4g.jpg
Binary file not shown.
Binary file removed media/thumb_filmes/demonslayer.jpg
Binary file not shown.
Binary file removed media/thumb_filmes/dragonball.png
Binary file not shown.
Binary file added media/thumb_filmes/fairytail.jpe
Binary file not shown.
Binary file removed media/thumb_filmes/fairytail.png
Binary file not shown.
Binary file added media/thumb_filmes/kimetsu.jpe
Binary file not shown.
Loading

0 comments on commit 99e4879

Please sign in to comment.