From 648be4ca5d543342fc559ad7fb06881b0f40e663 Mon Sep 17 00:00:00 2001 From: jiwoo Date: Fri, 28 Aug 2020 23:44:59 +0900 Subject: [PATCH] add time and more --- Building_list/admin.py | 4 +- Building_list/form.py | 0 Building_list/migrations/0001_initial.py | 28 +++--- .../migrations/0002_auto_20200828_1050.py | 18 ---- .../migrations/0002_auto_20200828_2145.py | 27 ++++++ .../migrations/0003_lecture_number.py | 18 ++++ Building_list/models.py | 86 ++++++++++++------ .../Building_list/building_list.html | 8 ++ .../templates/Building_list/option_check.html | 32 +++++++ .../templates/Building_list/room_detail.html | 17 ++++ .../templates/Building_list/room_list.html | 18 ++++ Building_list/urls.py | 5 + Building_list/views.py | 33 ++++++- Kuing/settings.py | 2 +- db.sqlite3 | Bin 176128 -> 159744 bytes layout/base.html | 1 + 16 files changed, 232 insertions(+), 65 deletions(-) create mode 100644 Building_list/form.py delete mode 100644 Building_list/migrations/0002_auto_20200828_1050.py create mode 100644 Building_list/migrations/0002_auto_20200828_2145.py create mode 100644 Building_list/migrations/0003_lecture_number.py create mode 100644 Building_list/templates/Building_list/building_list.html create mode 100644 Building_list/templates/Building_list/option_check.html create mode 100644 Building_list/templates/Building_list/room_detail.html create mode 100644 Building_list/templates/Building_list/room_list.html diff --git a/Building_list/admin.py b/Building_list/admin.py index 353d74f..8b99d8c 100644 --- a/Building_list/admin.py +++ b/Building_list/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from .models import Building, Lecture, Reservation +from .models import Room, Lecture, Reservation -admin.site.register(Building) +admin.site.register(Room) admin.site.register(Lecture) admin.site.register(Reservation) diff --git a/Building_list/form.py b/Building_list/form.py new file mode 100644 index 0000000..e69de29 diff --git a/Building_list/migrations/0001_initial.py b/Building_list/migrations/0001_initial.py index 5f21d5e..3717163 100644 --- a/Building_list/migrations/0001_initial.py +++ b/Building_list/migrations/0001_initial.py @@ -1,6 +1,5 @@ -# Generated by Django 3.1 on 2020-08-28 01:43 +# Generated by Django 3.1 on 2020-08-28 10:30 -from django.conf import settings from django.db import migrations, models import django.db.models.deletion @@ -10,20 +9,17 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( - name='Lecture', + name='Room', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('number', models.CharField(default='', max_length=10)), - ('floor', models.CharField(default='', max_length=10)), - ('class_time', models.CharField(default='', max_length=20)), - ('available_time', models.CharField(default='', max_length=20)), ('on_off', models.CharField(choices=[('사용중', '사용중'), ('빈강의실', '빈강의실')], default='빈강의실', max_length=50)), - ('day_of_the_week', models.CharField(default='', max_length=20)), + ('day_of_the_week', models.CharField(choices=[('월', '월'), ('화', '화'), ('수', '수'), ('목', '목'), ('금', '금'), ('토', '토'), ('일', '일')], default='월', max_length=20)), + ('available_time', models.TimeField(default='')), ], ), migrations.CreateModel( @@ -31,17 +27,21 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('purpose', models.TextField(default='', max_length=100)), - ('use_time', models.CharField(default='', max_length=20)), - ('lecture', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lecture_list', to='Building_list.lecture')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='photos', to=settings.AUTH_USER_MODEL)), + ('start_time', models.TimeField(default='')), + ('finish_time', models.TimeField(default='')), + ('floor', models.TextField(default='', max_length=10)), + ('room', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservation_room', to='Building_list.room')), ], ), migrations.CreateModel( - name='Building', + name='Lecture', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.TextField(default='', max_length=200)), - ('lecture', models.ManyToManyField(to='Building_list.Lecture')), + ('name', models.TextField(default='', max_length=100)), + ('start_time', models.TimeField(default='')), + ('finish_time', models.TimeField(default='')), + ('floor', models.TextField(default='', max_length=10)), + ('room', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lecture_room', to='Building_list.room')), ], ), ] diff --git a/Building_list/migrations/0002_auto_20200828_1050.py b/Building_list/migrations/0002_auto_20200828_1050.py deleted file mode 100644 index 8c0bac5..0000000 --- a/Building_list/migrations/0002_auto_20200828_1050.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.1 on 2020-08-28 01:50 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('Building_list', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='lecture', - name='day_of_the_week', - field=models.CharField(choices=[('월', '월'), ('화', '화'), ('수', '수'), ('목', '목'), ('금', '금'), ('토', '토'), ('일', '일')], default='월', max_length=20), - ), - ] diff --git a/Building_list/migrations/0002_auto_20200828_2145.py b/Building_list/migrations/0002_auto_20200828_2145.py new file mode 100644 index 0000000..9236351 --- /dev/null +++ b/Building_list/migrations/0002_auto_20200828_2145.py @@ -0,0 +1,27 @@ +# Generated by Django 3.1 on 2020-08-28 21:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('Building_list', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='lecture', + name='floor', + ), + migrations.AddField( + model_name='room', + name='floor', + field=models.TextField(default='', max_length=10), + ), + migrations.AlterField( + model_name='room', + name='day_of_the_week', + field=models.CharField(choices=[('mon', '월'), ('tue', '화'), ('wed', '수'), ('thu', '목'), ('fri', '금')], default='월', max_length=20), + ), + ] diff --git a/Building_list/migrations/0003_lecture_number.py b/Building_list/migrations/0003_lecture_number.py new file mode 100644 index 0000000..3e1b93c --- /dev/null +++ b/Building_list/migrations/0003_lecture_number.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2020-08-28 23:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('Building_list', '0002_auto_20200828_2145'), + ] + + operations = [ + migrations.AddField( + model_name='lecture', + name='number', + field=models.CharField(default='', max_length=10), + ), + ] diff --git a/Building_list/models.py b/Building_list/models.py index 5686473..f5337f3 100644 --- a/Building_list/models.py +++ b/Building_list/models.py @@ -1,45 +1,73 @@ from django.db import models from django.conf import settings +from django.utils import timezone +from datetime import datetime, timedelta, date FlAG = [ ('사용중', '사용중'), ('빈강의실', '빈강의실'), ] -WEEK = [ - ('월', '월'), - ('화', '화'), - ('수', '수'), - ('목', '목'), - ('금', '금'), - ('토', '토'), - ('일', '일'), +WEEK = [ #첫번재가 장고, 두번째가 탬플릿 + ('mon', '월'), + ('tue', '화'), + ('wed', '수'), + ('thu', '목'), + ('fri', '금'), ] -class Lecture(models.Model): - #호 +class Room(models.Model): + # 호 number = models.CharField(max_length=10, default='') - #층 - floor = models.CharField(max_length=10, default='') - #수업시간(24시 기준) - class_time = models.CharField(max_length=20, default='') - #사용가능시간 - available_time = models.CharField(max_length=20, default='') - #사용여부 + # 사용여부 on_off = models.CharField(max_length=50, choices=FlAG, default='빈강의실') #요일 day_of_the_week = models.CharField(max_length=20, choices=WEEK, default='월') + #사용 가능 시간 + available_time = models.TimeField(default='') + #층 + floor = models.TextField(max_length=10, default='') -class Building(models.Model): - #건물이름 - name = models.TextField(max_length=200, default='') - #강의 모델 - lecture = models.ManyToManyField(Lecture) + def __str__(self): + return self.number+"호/ "+self.day_of_the_week+ "요일" + +class Lecture(models.Model): + # 룸 모델 + room = models.ForeignKey(Room, on_delete=models.CASCADE, related_name="lecture_room") + # 강의 명 + name = models.TextField(max_length=100, default='') + #수업 시작 시간 + start_time = models.TimeField(default='') + #수업 종료 시간 + finish_time = models.TimeField(default='') + #강의 순서 + number = models.CharField(max_length=10, default='') + + def __str__(self): + return self.name + + def created_string(self): + time_now = timezone.now().time() + + time = datetime.combine(date.min, self.start_time)-datetime.combine(date.min, time_now) + if time < timedelta(minutes=1): + return 'dfadf' + elif time < timedelta(hours=1): + return str(int(time.seconds / 60)) + '분 전' + elif time < timedelta(days=1): + return str(int(time.seconds / 3600)) + '시간 전' + else: + return 'false' class Reservation(models.Model): - # 강의 모델 - lecture = models.ForeignKey(Lecture, on_delete=models.CASCADE, related_name="lecture_list") - # 목적 + # 룸 모델 + room = models.ForeignKey(Room, on_delete=models.CASCADE, related_name="reservation_room") + # 강의 명 purpose = models.TextField(max_length=100, default='') - # 사용시간 - use_time = models.CharField(max_length=20, default='') - # 유저모델 - user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='photos') + #예약 시작 시간 + start_time = models.TimeField(default='') + #예약 종료 시간 + finish_time = models.TimeField(default='') + #층 + floor = models.TextField(max_length=10, default='') + + def __str__(self): + return self.name \ No newline at end of file diff --git a/Building_list/templates/Building_list/building_list.html b/Building_list/templates/Building_list/building_list.html new file mode 100644 index 0000000..e7d0045 --- /dev/null +++ b/Building_list/templates/Building_list/building_list.html @@ -0,0 +1,8 @@ +{% load static %} + +{% block title %} +{% endblock %} + +{% block content %} + 04 교육과학관 +{% endblock %} \ No newline at end of file diff --git a/Building_list/templates/Building_list/option_check.html b/Building_list/templates/Building_list/option_check.html new file mode 100644 index 0000000..82c3a0d --- /dev/null +++ b/Building_list/templates/Building_list/option_check.html @@ -0,0 +1,32 @@ +{% load static %} + +{% block title %} +{% endblock %} + +{% block content %} +
+
+ {% csrf_token %} +
+

옵션 선택

+

전체해지

+ +
+

요일

+
+ + + + + +
+

층 수

+
+ + + + +
+
+
+{% endblock %} \ No newline at end of file diff --git a/Building_list/templates/Building_list/room_detail.html b/Building_list/templates/Building_list/room_detail.html new file mode 100644 index 0000000..b88f9d0 --- /dev/null +++ b/Building_list/templates/Building_list/room_detail.html @@ -0,0 +1,17 @@ +{% load static %} + +{% block title %} +{% endblock %} + +{% block content %} +
+ {% if lectures %} + {% for temp in lectures %} +
+

{{ temp.name }}

+

{{ temp.created_string }}

+
+ {% endfor %} + {% endif %} +
+{% endblock %} \ No newline at end of file diff --git a/Building_list/templates/Building_list/room_list.html b/Building_list/templates/Building_list/room_list.html new file mode 100644 index 0000000..e244302 --- /dev/null +++ b/Building_list/templates/Building_list/room_list.html @@ -0,0 +1,18 @@ +{% load static %} + +{% block title %} +{% endblock %} + +{% block content %} +
+ {% if rooms %} + {% for temp in rooms %} +
+

{{ temp.number }}

+

{{ temp.available_time }}

+

{{ temp.on_off }}

+
+ {% endfor %} + {% endif %} +
+{% endblock %} \ No newline at end of file diff --git a/Building_list/urls.py b/Building_list/urls.py index b7f8d66..c5b570a 100644 --- a/Building_list/urls.py +++ b/Building_list/urls.py @@ -1,7 +1,12 @@ from django.urls import path, include from django.conf.urls.static import static from django.conf import settings +from .views import * app_name = "Building_list" urlpatterns = [ + path('', building_list, name='building_list'), + path('option_check/', option_check, name='option_check'), + path('room_list/', room_list, name='room_list'), + path('room_detail//', room_detail, name='room_detail'), ] \ No newline at end of file diff --git a/Building_list/views.py b/Building_list/views.py index 91ea44a..5628be7 100644 --- a/Building_list/views.py +++ b/Building_list/views.py @@ -1,3 +1,34 @@ from django.shortcuts import render +from .models import Reservation,Room,Lecture -# Create your views here. + +def building_list(request): + return render(request, "Building_list/building_list.html") + +def option_check(request): + return render(request, "Building_list/option_check.html") + +def room_list(request): + if request.method == 'POST': + day_of_the_week = request.POST['day_of_the_week'] + floors = request.POST['floor'] + + rooms = Room.objects.all() + lectures = Lecture.objects.all() + room_dict = {} + for i in range(0, rooms.__len__()): + temp = rooms[i] + if (temp.day_of_the_week == day_of_the_week) and (temp.floor == floors): + room_dict[temp] = i + + return render(request, "Building_list/room_list.html", {"rooms": room_dict}) + +def room_detail(request, room_id): + lectures = Lecture.objects.all() + lecture_dict = {} + for i in range(0, lectures.__len__()): + tmp = lectures[i] + if tmp.room == Room.objects.get(id=room_id): + lecture_dict[tmp] = i + + return render(request, "Building_list/room_detail.html", {"lectures": lecture_dict}) \ No newline at end of file diff --git a/Kuing/settings.py b/Kuing/settings.py index e3fcbb2..49feb0b 100644 --- a/Kuing/settings.py +++ b/Kuing/settings.py @@ -113,7 +113,7 @@ USE_L10N = True -USE_TZ = True +USE_TZ = False # Static files (CSS, JavaScript, Images) diff --git a/db.sqlite3 b/db.sqlite3 index b98a143d7c17f07f3559bb4aa5a3efe0d6c77f06..0663020b348df0faad2ef2a73a6212feba0250a2 100644 GIT binary patch delta 6728 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 delta 4750 zcmds5X>1$E72dZzmiJ25L0cz9Q73imMeeR5S)!(d?c|o6y*70hH&Y?5Kkc}=n zpawF~R1XxQ4~v0{0R^bJ1Xy!AWgU?r>JLu_L;KOQmDszw2x#X)CegSK2Q@t^AYf#S`L;vy{EM zph-npc^-}~%=-fo@dC4r8{%SgB8Zf0BFB(r6dyUzKODjdTXAR1woH85BxEK!qR5MaFC)pUb z&c)R6Y>mssikwTzP~I-ANXMwa*9l?`E4u~O&2LaP<~q_Drp_hQaqb$K!ympQUFph| zQ>Y}nC4p~BQ&29u1{DNGc6({%a;~rjWmtw|+bv2#o|HmG!Q~dEHnTF4C#F!h%(1fA zX;NOvt6ziif-J}$qw-ZAmqJ|hO# zQdL-#@?}|>k(pXj*;{B!p^V7094CTuy0E-tm34-3ORURG|B#^QhY0!#{RjGWdXavd zeu{o*C7tom25c(SZKPGAPVv{alLVo>SX-&dP^qeQ%H`TpI@5r+jh>bWdK)d#6DyV@ zm9$cSI!DS;m*qqALO2o(PmT;m!gKS1TLWFbx~zD;X*M($nqBnIho>f$lcx`5iUj>B zeVP6Z{Y&~BeUgsQeYA-4$)}YE&gICPbZVk3|E{s~C~PWTXIdBg+#x7XsAo8<-uw^q zAI%rcFPo7$YMwAZXl^sJ<^sH_e{WK1UhX-Zp@uThErvr&gUQ5gS!!^CE*Of0=0mG! zVFDc*^-qqZ(1HzWC;^>67+iJC&sIYm22s%?DdLmx7bM z;(TztR#@k8Hrv--tOei8vEFGK_7G05WL>wPkJRr^v@0aJr8D>cwuL*70KQPuc z*RvG%^m%%#+vX0mZau(sNudRaANLIGoY^+xkM!;tAM6OWFjL*3JqH2@+on6X*&)9y z?Vp|Wgs)lp9n~${XW5?F zzp6pehS2J*fJ`cTc zbI@a^z91~Bw+Y%|c~}3Q_D%DW>7+JOvs3*Y<8^(buGLttdK=z?JmN9p9ijohtF<5F z-?b-@%>ngknci)!p8i&wue+s{`a;!+8akmK^3b^mnT1YwLL=7Wi=EJll`shz(BC?- zU~S!scXt6gxD~1(|NIME;S#8$TdWj1)D3;eW(N(H+rc83)Blg8e&5|ySZypNdX-CL zenN$7RMDj@v}}VAUIP}*WmPmI6FpW8n{i)()7=KI5HcRve8dl@v?ta0-0#qf%SN^9eT*L3{>cV28<;m#~T|RI_`ifa_kz3&EHuWBb~;&Z}$)7)=*L-%Lh2JOdqD@>3ps@Yx!4fTv*;ryY=RQ>r4!0C z?qXLyFci}%++GpQtV8|?*#NfKh8a*r-4c4*3+0&oy%XdU}o zphz3oa1(}mp6N{0DPlvP6NvDncC$9VYk60^1=1Aie?)NT>ICU99~0b^wW0zZEk0K1 zPBdB6dE8_@4!EZ)i}!SvL{C?m=;^fUd%AACrbjxU63fF^+HL6H9q=MJ;;ocA*-8zO zzG5`J1+%Qd&C>w-*A{3}W9l~EenwbTRA@pkIiWOd0qa_fKE^#15LrP?&{rC#?+#;( zyR2JJ*ehZy)mW`Q9~>V?%O1$6P3lncy{wbDRhdaz9m=z&JYDh`lJr20VbX|BIKiPWZJ?|&ZoEh0*%T%t-#v@s)a=nT8>;WbyZ%0_ z2pHleuIFqT7&UpAm0VmXuhPoRDUHfuSVWYKD@n({*I<>YS{`Iuiqp;Mj(3D4VvKjxW$ zRz2gB9*#^+p^w63 zj$tU`pPL(;4^M>9zA-WzSz{F>Fh*u7W0rPfMYPXLS!a9@U5M8fZ<6ZdMqT|KD>Hsx zl!u4qyKkzbXJzdCPpx$p5=#U-o1nX=B|gb&0MZn)OgO{8y{@|tJu6-Nyooi&=_gQMPf(*3K}yG@nE@T~qJ zmtPtdrNM>C@J#dCe*KP$QWmd-NM8k(!}k^bepZ&MNr`tOG*MQ6BYMRN_B#sb*H+hz z)#@5;XvF_U_%8`wc8X8@CiZWp{tv1){;Li3jglS4ienq +