From 4f9b2e2d2b4ca5f6afce76b41bf6f9bf0f304a77 Mon Sep 17 00:00:00 2001 From: andrei Date: Thu, 18 Apr 2024 00:18:53 +0500 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=B3?= =?UTF-8?q?=D0=BB=D0=B0=D0=B2=D0=BD=D1=83=D1=8E=20=D1=81=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=87=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CineSync/films/models.py | 19 ++++-- CineSync/home/views.py | 23 ++++++- CineSync/static/css/home/homepage.css | 80 ++++++++++++++++++++++++- CineSync/static/css/includes/header.css | 1 + CineSync/templates/home/homepage.html | 61 ++++++++++++++++++- CineSync/timetable/models.py | 21 ++++++- 6 files changed, 194 insertions(+), 11 deletions(-) diff --git a/CineSync/films/models.py b/CineSync/films/models.py index a8f719d..749a106 100644 --- a/CineSync/films/models.py +++ b/CineSync/films/models.py @@ -1,6 +1,5 @@ import time from datetime import timedelta -from random import shuffle from django.db.models import ( Model, @@ -12,6 +11,7 @@ from django.db.models import ( ) from django.utils import timezone from django.core.validators import MinValueValidator +from sorl.thumbnail import get_thumbnail class FilmManager(Manager): @@ -23,11 +23,19 @@ class FilmManager(Manager): def on_main(self): current_datetime = timezone.now() end_datetime = current_datetime + timedelta(days=5) - films_with_sessions = Film.objects.filter( + films_with_sessions = super().get_queryset().filter( sessions__start_datetime__gte=current_datetime, sessions__start_datetime__lte=end_datetime, - ).exclude(image=None).distinct() - shuffle(list(films_with_sessions)) + ).exclude(image=None).distinct().only( + Film.name.field.name, + Film.image.field.name, + Film.description.field.name, + ) + + if films_with_sessions.count() > 5: + films_with_sessions = films_with_sessions[:5] + elif films_with_sessions.count() > 0: + films_with_sessions = films_with_sessions[:films_with_sessions.count()] return films_with_sessions @@ -49,6 +57,9 @@ class Film(Model): def get_upload_path(self, filename): return f'users/films/{self.pk}/{time.time()}_{filename}' + def get_image_url(self): + return self.image.url + objects = FilmManager() name = CharField( diff --git a/CineSync/home/views.py b/CineSync/home/views.py index 4e83e8f..c7cd9dd 100644 --- a/CineSync/home/views.py +++ b/CineSync/home/views.py @@ -1,16 +1,37 @@ +import datetime +from datetime import date +from collections import defaultdict +from pprint import pprint +from random import shuffle + +from django.db.models import QuerySet from django.http import HttpResponse from django.shortcuts import render from films.models import Film +from timetable.models import FilmSession def homepage(request): films = Film.objects.on_main() + film_sessions = FilmSession.objects.nearest_timetable() + sessions_by_date_and_film = defaultdict(lambda: defaultdict(list)) + + for session in film_sessions: + session_date = session.start_datetime.date() + sessions_by_date_and_film[session_date][session.film].append(session) + + for session in film_sessions: + session_date = session.start_datetime.date() + sessions_by_date_and_film[session_date] = dict(sessions_by_date_and_film[session_date]) + template = render( request, 'home/homepage.html', context={ - 'films_preview': films + 'films_preview': films, + 'films_sessions': dict(sessions_by_date_and_film), + 'tomorrow': date.today() + datetime.timedelta(days=1) } ) return HttpResponse( diff --git a/CineSync/static/css/home/homepage.css b/CineSync/static/css/home/homepage.css index 4f7eade..9e1a18e 100644 --- a/CineSync/static/css/home/homepage.css +++ b/CineSync/static/css/home/homepage.css @@ -3,7 +3,7 @@ height: 30vw; width: 100%; } -.film_card_image { +.film_preview_image { object-fit: cover; height: 30vw !important; width: 70% !important; @@ -21,4 +21,82 @@ flex-direction: column; align-items: center; margin-left: 15%; +} +.header_title { + width: 100%; + text-align: center; + color: #eaeaea; + font-weight: bold; + margin-bottom: 2vw; +} +.timetable_block { + margin-top: 10vw; + height: 100vw; +} +.tab_btn { + color: #eaeaea !important; +} +.tab_btn.active { + color: #0d1d3a !important; +} +.timetable_body.active { + margin-top: 1vw; + margin-bottom: 10vw; + padding-top: 2vw; + padding-bottom: 2vw; + flex-direction: column; +} +.film_card { + width: 100%; + background-color: #eaeaea; + margin-top: 1vw; + margin-bottom: 1vw; + border-radius: 3vw; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + justify-content: flex-start; +} +.film_card_image { + object-fit: cover; + height: 10vw !important; + width: 10vw !important; + border-radius: 3vw; +} +.film_card_column { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: space-around; + height: 10vw; + margin-left: 2vw; +} +.film_card_column_item { + height: 20%; +} +.film_card_row { + height: 80%; + display: flex; + align-items: center; + flex-direction: row; + flex-wrap: nowrap; +} +.film_session { + display: inline-block; + background-color: rgb(255, 91, 119); + color: #ffffff; + font-weight: bold; + padding: 5px; + margin: 5px; + border-radius: 5px; +} +.session_time { + font-size: 12px; + color: #ffffff; + text-decoration: none; +} +.session_time:hover { + color: #ffffff; + text-decoration: none; } \ No newline at end of file diff --git a/CineSync/static/css/includes/header.css b/CineSync/static/css/includes/header.css index e47f403..434b527 100644 --- a/CineSync/static/css/includes/header.css +++ b/CineSync/static/css/includes/header.css @@ -20,6 +20,7 @@ header { .header_container { width: 100%; position: fixed; + z-index: 100; } .nav-item { margin: 5px; diff --git a/CineSync/templates/home/homepage.html b/CineSync/templates/home/homepage.html index 4c63f23..fd446fe 100644 --- a/CineSync/templates/home/homepage.html +++ b/CineSync/templates/home/homepage.html @@ -6,8 +6,8 @@ {% block content %}