From 7bf7404fd1a873c138dc7c7208c99c3a7034d253 Mon Sep 17 00:00:00 2001 From: Minhao Qiu <minhao.qiu@fau.de> Date: Mon, 15 Jun 2020 21:14:57 +0200 Subject: [PATCH] add new topic --- .../boards/__pycache__/tests.cpython-36.pyc | Bin 2176 -> 3734 bytes .../boards/__pycache__/views.cpython-36.pyc | Bin 733 -> 939 bytes Lecture1/myproject/boards/tests.py | 29 +++++++- Lecture1/myproject/boards/views.py | 8 +- Lecture1/myproject/db.sqlite3 | Bin 167936 -> 167936 bytes .../myproject/__pycache__/urls.cpython-36.pyc | Bin 1064 -> 1124 bytes Lecture1/myproject/myproject/urls.py | 3 +- Lecture1/myproject/static/css/app.css | 3 + Lecture1/myproject/templates/base.html | 27 +++++++ Lecture1/myproject/templates/home.html | 69 ++++++++---------- Lecture1/myproject/templates/new_topic.html | 25 +++++++ Lecture1/myproject/templates/topics.html | 30 ++++---- 12 files changed, 135 insertions(+), 59 deletions(-) create mode 100644 Lecture1/myproject/static/css/app.css create mode 100644 Lecture1/myproject/templates/base.html create mode 100644 Lecture1/myproject/templates/new_topic.html diff --git a/Lecture1/myproject/boards/__pycache__/tests.cpython-36.pyc b/Lecture1/myproject/boards/__pycache__/tests.cpython-36.pyc index c209d87396ba39710200361e59b90e6089d7be17..ddddac05ec04d811223d7a5a8c616add86509909 100644 GIT binary patch literal 3734 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 delta 598 zcmbOx+aRcH%*)GVtal{t1q%biV+JI^!oa}bz`(#z95Yc_*MyNFg*k;aha;CWij$GS zogsxSg}sF#g*}zAnK_EfogsxIg|merg%ix@PT>k>(Bz&tLtB*T7E4BcZt5+br2NF9 zl=zbTg3RRNiH{#K3Qa!7cuRwqfq~%`OIm4OauFK?1A``05kFX@EHkydNQi-f0YV5* zKEc#xC<5Y3fCz*Pm?aDn<78l9-~hQ7<Zuo~4%Q;h$@R>Aj8T*MSo9b<Cfl-z3xEuV zm<Z7~IfZ4q4Hw8_)*@z*A>1H>2Sk8eR>TLAVg|dZNB|@%2qM6G!G!Q+bJjDyN(>AP zFOxw^8H<z|7#K3AFfuS`l51iB+bK1$<zgVa*g?iZLZwI?BmlM-ObAbQVDGe$1PMxk z2x$<Z2qIKKgc^uY2N7V^2m%~hGLsoOMA>B+7#RFCc_wr4S$W)I%gs+o%_%Md1!55> pG>bseNWld*0;KyEhfQvNN@-529U~~fK>^6aD8MMd$ipJQ4FK1_VTJ$z diff --git a/Lecture1/myproject/boards/__pycache__/views.cpython-36.pyc b/Lecture1/myproject/boards/__pycache__/views.cpython-36.pyc index 187548c89cf5f4edfe5daec7b8289832a718e1e4..eacc6c1ead6f631aac70f17eeb53822a4512e473 100644 GIT binary patch delta 614 zcmcc1x|+S-n3tC;>)`V^XJ!V5#|%h-iGhK^fq{XcIDmnHA%!7@F^3_SF^VylDT;{^ z#AnK3&Si;W0kfHNm~&a9SQ!~oSW;MX*mBvU*clm8*izVA7@{~*I8r!U7@{~+xKg-V z7^1jRc!C);d0&F8(qxjp#a5J>my%j^OE5jPBtAbWD>b<!KEEj5#K2@?br~c3#7{~b z91IK$D;bJ-Cd)AT^0R^5!~)XI$i-R2H@Skbx}KeZfuV?#fq~%`b9!pYEgqNr)MCH< z64#2%;*ug(kR-@An#@JqAT=CG`H4j-@tG+_0w5_KIKc~&<$=hS<QHTn7Yl<d;{sd8 z#3;lhz{tf|B*MVJkPI>pB+Sgfz`$D1z`)=PQYpj0z)-?a!dSzY!r04H%T&Tt!;r$1 z!d%0Y$=J*s%%I8Qr^#5v&%nS?#g~^_9uKxeFQX(k2kaD0<|2@JMPToMY=FAB2;>Z~ ziXt?}a)M2%2e}nwcQGVfco>UB85kJ+G`XV$QnC{B()0C-GxCc{l1od9i$Lart+~Yw zmCGn8DJTNz1P9eEw%q)b)SP07EBHWx1M)H0L?r9M4gm)khmA~beoARhsvRRJ3_ubB Nj65L7#KFtK2>@11cYOc= delta 410 zcmZ3@ewVf0n3tE!T<=KS93}>a#|%h-iGhK^fq{Xc*oA?CA%!7@F^3_SF^Z89#AeE2 z%4LpX2D6!Sm~vU7SQr^nSW;MXSaaE;*ccg7*izVA7^2uyI8r!U7@{~*xPlopxnF{e z*JQlKR+O5Tl3Jw6c#CJ^ydp-n$%2eZ9PA7X3@aImxF=gP`tpM~#VjD@j9i>WypyLh zR@bvJFfbHxFfcIOVopyjxy9p>pIYpfU*cMkSzJ;CQd<OavL<s87f209Qhs7lN_=KY z5kE*DH=N)B$?`yCOY#dclZ!<_z65DvU}RzxViI8FVk{D7U|{gm<ctzX$x6&i&(|x? z$j&b+NiHoZ2HSFr8!DbrQc_UF3^E+#f?I64`6;P6#YJGZ@`8jx1{EP}2eZIV;IPTf TPbtkwwPS=?&%+3Y%pAM`0pL-l diff --git a/Lecture1/myproject/boards/tests.py b/Lecture1/myproject/boards/tests.py index 31c6f40..ea8e8ef 100644 --- a/Lecture1/myproject/boards/tests.py +++ b/Lecture1/myproject/boards/tests.py @@ -1,6 +1,6 @@ from django.test import TestCase from django.urls import reverse, resolve -from .views import home, board_topics +from .views import home, board_topics, new_topic from .models import Board @@ -33,4 +33,29 @@ class BoardTopicsTests(TestCase): # resolve("/boards/1/") is different as resolve("/boards/1") def test_board_topics_url_resolves_board_topics_view(self): view = resolve("/boards/1/") - self.assertEquals(view.func, board_topics) \ No newline at end of file + self.assertEquals(view.func, board_topics) + + +class NewTopicTests(TestCase): + def setUp(self): + Board.objects.create(name="Django", description="Django board.") + + def test_new_topic_view_success_status_code(self): + url = reverse("new_topic", kwargs={"board_id": 1}) + response = self.client.get(url) + self.assertEquals(response.status_code, 200) + + def test_new_topic_view_not_found_status_code(self): + url = reverse("new_topic", kwargs={"board_id": 99}) + response = self.client.get(url) + self.assertEquals(response.status_code, 404) + + def test_new_topic_url_resolves_new_topic_view(self): + view = resolve("/boards/1/new/") + self.assertEquals(view.func, new_topic) + + def test_new_topic_view_contains_link_back_to_board_topics_view(self): + new_topic_url = reverse('new_topic', kwargs={"board_id": 1}) + board_topics_url = reverse('board_topics', kwargs={'board_id': 1}) + response = self.client.get(new_topic_url) + self.assertContains(response, 'href="{0}"'.format(board_topics_url)) \ No newline at end of file diff --git a/Lecture1/myproject/boards/views.py b/Lecture1/myproject/boards/views.py index 5d45a96..62f94a9 100644 --- a/Lecture1/myproject/boards/views.py +++ b/Lecture1/myproject/boards/views.py @@ -1,9 +1,8 @@ -from django.shortcuts import render +from django.shortcuts import render, get_object_or_404 from django.http import HttpResponse from django.http import Http404 from .models import Board - def home(request): boards = Board.objects.all() """ @@ -25,3 +24,8 @@ def board_topics(request, board_id): raise Http404 return render(request, 'topics.html', {'board': board}) + +def new_topic(request, board_id): + board = get_object_or_404(Board, pk=board_id) + return render(request, 'new_topic.html', {'board': board}) + diff --git a/Lecture1/myproject/db.sqlite3 b/Lecture1/myproject/db.sqlite3 index f496c5b875e9faedd723e6b1785317ae3c937f28..9ab07beb707818b1ce1d9fd68f87485b1a0d4bca 100644 GIT binary patch delta 524 zcmZozz}2vTYl1YR=0q81M$L^0qWX-?lgspz7&$lJ)YmrPV&<=6;J?eiiN9)NV-CNC z88ZumWNJ`iUP^whM`}^3LS=rbLULlBLP}<Fa%pj~LSj;WX^BE&UZp}#YI<UhLP<tu zUV5?K<W2cOT+I9r82G>Ozvh3iS+L*|KQ|Y%BqPKq=FP9`FUSj<=^C0U7+P2vnOm8d z=^2}u8dx@;n?L>Bd`2@CM*iOn8w>jQCr(J^XJKaKWanaFU|{6`!@&P%vtYw}enAEX z24-eXPF}F^5eEJvn*|GY@!ME2axysbOKLN6avB*J8R#0oEwQjNw$L*-G_y1_GKM%K zx>_kQB_%aQ$x5NRwl<c1+XY6J2^>tkEew2zcw06$R`6;xSu?Tvwy-)HnwS*lnk3~{ z<W?kB6eg9G=bBdL=cOc>XQrp-rIe&>f0f6?#3*B?Yh;P!BXe^LBhw~pMz9gnAJj7` zfYeDbaxn34XW-w?e`m8`!D@b06=q*XLKZMhzf;eo!NJ6Tn1TNh|KZJo1>5;;<(M5A hVZOw)m`Rq|5gG`lx&~%ocUf8)TId;=m|2>d007F^m7M?p delta 208 zcmZozz}2vTYl1YR>O>i5M%9f8qWX+Xlgspz7&$iI)YmrPVB+7zz<-y2(`LbfW&D#j z<p*&v@xNx^|Hl7%vtYx0{>cyOSvJ3~KO-+}qHAQNU}#}wWNBq+p=V%hYG&MgZvOOh z^BK)Hvpo1CzvzI#qzNp`SuQY6U}NMv#K3oGW8)4!jwWkHR^Jv@$LSC1nH09a%43pZ zWMkyN!@z%MvtYv|{^@t>nKalK`5!UxKiVwVaD!h?mf4Zh$iT=z*T7WQzzoSo6EjOw F699|DLgxSg diff --git a/Lecture1/myproject/myproject/__pycache__/urls.cpython-36.pyc b/Lecture1/myproject/myproject/__pycache__/urls.cpython-36.pyc index e11f359e0cee58bb35e8f3e04531a836ba09fe4d..d0c8dcafca0d39cb3d22d0c6119a932e8996bf32 100644 GIT binary patch delta 153 zcmZ3%@q|O!n3tF9?BVBe(ku)Nj~S2v2Ll6x0|Ns?aoR-XV2M<g6z){EEbbJZ6pmiz zbe1Td6y9J4O}>o{SD2Wpq$V3MiwWhWmh0c*%u6kgFUc>+O!m{{ogB^_EM3IOz`$^e wyR;~$AhDz*wJ5K6B}0(_0|P^mz~lqW5kh<n3=AxcJd8X{Jj^_de2jdI0Iazpr2qf` delta 98 zcmaFDv4TU{n3tC;OZ7<Hd1eNN#|%h-oq>VDfq{XcIAWr5FjqQr6n6@DFoPz~#=a{| t%zm0YlY5whCqH2pVB=?CU?}3B{EIn4fQNyBfrXKWk%x(gnTL^&5dg{F5#;~? diff --git a/Lecture1/myproject/myproject/urls.py b/Lecture1/myproject/myproject/urls.py index 47bea4c..e4c9c17 100644 --- a/Lecture1/myproject/myproject/urls.py +++ b/Lecture1/myproject/myproject/urls.py @@ -21,7 +21,8 @@ from boards import views urlpatterns = [ path('admin/', admin.site.urls), path('', views.home, name='home'), - path('boards/<int:board_id>/', views.board_topics, name='board_topics') + path('boards/<int:board_id>/', views.board_topics, name='board_topics'), + path('boards/<int:board_id>/new/', views.new_topic, name='new_topic'), #path(r'^(?P<username>[\w.@+-]+)/$', views.user_profile, name="user_profile") ] diff --git a/Lecture1/myproject/static/css/app.css b/Lecture1/myproject/static/css/app.css new file mode 100644 index 0000000..b5266d5 --- /dev/null +++ b/Lecture1/myproject/static/css/app.css @@ -0,0 +1,3 @@ +.navbar-brand { + font-family: 'MuseoModerno', cursive; +} \ No newline at end of file diff --git a/Lecture1/myproject/templates/base.html b/Lecture1/myproject/templates/base.html new file mode 100644 index 0000000..5e67bcb --- /dev/null +++ b/Lecture1/myproject/templates/base.html @@ -0,0 +1,27 @@ +{% load static %}<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>{% block title %}Django Boards{% endblock %}</title> + <link href="https://fonts.googleapis.com/css2?family=MuseoModerno:wght@600&display=swap" rel="stylesheet"> + <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"> + <link rel="stylesheet" href="{% static 'css/app.css' %}"> + </head> + <body> + + <nav class="navbar navbar-expand-ld navbar-dark bg-dark"> + <div class="container"> + <a class="navbar-brand" href="{% url 'home' %}">Django Boards</a> + </div> + + </nav> + <div class="container"> + <ol class="breadcrumb my-4"> + {% block breadcrumb %} + {% endblock %} + </ol> + {% block content %} + {% endblock %} + </div> + </body> +</html> \ No newline at end of file diff --git a/Lecture1/myproject/templates/home.html b/Lecture1/myproject/templates/home.html index 167b3ef..052fdfa 100644 --- a/Lecture1/myproject/templates/home.html +++ b/Lecture1/myproject/templates/home.html @@ -1,38 +1,31 @@ -{% load static %}<!DOCTYPE html> -<html> - <head> - <meta charset="utf-8"> - <title>Boards</title> - <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"> - </head> - <body> - <div class="container"> - <ol class="breadcrumb my-4"> - <li class="breadcrumb-item active">Boards</li> - </ol> - <table class="table"> - <thead class="thead-inverse"> - <tr> - <th>Board</th> - <th>Posts</th> - <th>Topics</th> - <th>Last Post</th> - </tr> - </thead> - <tbody> - {% for board in boards %} - <tr> - <td> - {{ board.name }} - <small class="text-muted d-block">{{ board.description }}</small> - </td> - <td class="align-middle">0</td> - <td class="align-middle">0</td> - <td></td> - </tr> - {% endfor %} - </tbody> - </table> - </div> - </body> -</html> \ No newline at end of file +{% extends 'base.html' %} + +{% block breadcrumb %} + <li class="breadcrumb-item active">Boards</li> +{% endblock %} + +{% block content %} + <table class="table"> + <thead class="thead-inverse"> + <tr> + <th>Board</th> + <th>Posts</th> + <th>Topics</th> + <th>Last Post</th> + </tr> + </thead> + <tbody> + {% for board in boards %} + <tr> + <td> + <a href="{% url 'board_topics' board.pk %}">{{ board.name }}</a> + <small class="text-muted d-block">{{ board.description }}</small> + </td> + <td class="align-middle">0</td> + <td class="align-middle">0</td> + <td></td> + </tr> + {% endfor %} + </tbody> + </table> +{% endblock %} \ No newline at end of file diff --git a/Lecture1/myproject/templates/new_topic.html b/Lecture1/myproject/templates/new_topic.html new file mode 100644 index 0000000..c154e45 --- /dev/null +++ b/Lecture1/myproject/templates/new_topic.html @@ -0,0 +1,25 @@ +{% extends 'base.html' %} + +{% block title %}Start a new topic{% endblock %} + +{% block breadcrumb %} + <li class="breadcrumb-item"><a href="{% url 'home' %}">Boards</a></li> + <li class="breadcrumb-item"><a href="{% url 'board_topics' board.pk %}">{{ board.name }}</a></li> + <li class="breadcrumb-item active">New topic</li> +{% endblock %} + +{% block content %} +<form method="post"> + {% csrf_token %} + <div class="form-group"> + <label for="id_subject">Subject</label> + <input type="text" class="form-control" id="id_subject" name="subject"> + </div> + <div class="form-group"> + <label for="id_message">Message</label> + <textarea class="form-control" id="id_message" name="message" rows="5"></textarea> + </div> + <button type="submit" class="btn btn-success">Post</button> +</form> + +{% endblock %} \ No newline at end of file diff --git a/Lecture1/myproject/templates/topics.html b/Lecture1/myproject/templates/topics.html index 80c7eae..0864079 100644 --- a/Lecture1/myproject/templates/topics.html +++ b/Lecture1/myproject/templates/topics.html @@ -1,16 +1,14 @@ -{% load static %}<!DOCTYPE html> -<html> - <head> - <meta charset="utf-8"> - <title>{{ board.name }}</title> - <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"> - </head> - <body> - <div class="container"> - <ol class="breadcrumb my-4"> - <li class="breadcrumb-item">Boards</li> - <li class="breadcrumb-item active">{{ board.name }}</li> - </ol> - </div> - </body> -</html> \ No newline at end of file +{% extends 'base.html' %} + +{% block title %} + {{ board.name }} - {{ block.super }} +{% endblock %} + +{% block breadcrumb %} + <li class="breadcrumb-item"><a href="{% url 'home' %}">Boards</a></li> + <li class="breadcrumb-item active">{{ board.name }}</li> +{% endblock %} + +{% block content %} + <!-- just leaving it empty for now. we will add core here soon. --> +{% endblock %} \ No newline at end of file -- GitLab