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
zcmXr!<>hid@jQ-&lY!we0}^0iU|?`yU|=XNU|?WKVMt-jVaR2SVq^rdnR1wNnWLC<
zS)y1N8B&;2SaMi%*`nBT*`wHVIifhgVyrowxm;0Pj12A!DQqe1Eet8_sf^9cQQYnf
zDI6)BEet7~U_OsKLkd?4cMC%bH<-_x!V}D($@>!I6ivok93iR2CC-V(shUi;*o#uj
zQj3aHL5$-3oU+uHj0_A6n#{LYGV*g%Z}BAMCl;l|m*f{@CKuo0%u6kYur(QPu{wdI
zl0jy|FcZvwG7Jn1sSHt!DGX6eDU2yhEeui2AV0M*M6sl>1~X`~-Qx7f&rJn6q&OL5
zBghD51_lNYb_NBJ8Uq7E2}25FGh;1d4MP@V7E=v~%~ZpX#azRb#gf9*%mfO!U<OTQ
zzalmU28Nd>KrUx30vU0OEjcGMHLv6rb9!pYEuO^U;?$xN*TT}ooZ?&D#U+U)rN!~d
z`6;O&j~1uqq}^gJEy}sYQIuL-ke^qax{{$tn1O-emy<py6!dd5^D+|i^<DClOLJ56
zN{aQ9i%ku5%Ttr|eNvN4N{dnr^>Zr=it@8klS}l$Ay%wkl3H9+tXEKZOA5q_2bmLJ
zmYG@}k7PS1$fF>qGca;6@-SAZz{5ljw<dUSfkGSPS8#Aip#@hBV-`~hGdzfx{C+X&
zYqAu9QeY7u0|Ub?mbB8mWN^4?G8GAcML^C2`x`=tfCLo~4k<0li7!e8Cz4`>e?W#6
zgNz0Fp-Kyz53p<W(`3EH5g(tIn420Oe~T+VJ~uz5GzY}yiH`@x6hx*-l!1YvND@SV
zq6FeJFbm|qA}$671`bd#f}Fs?$iWI0!JaC0@TSTXwibpc))e*>juwU}wiM1_22HM8
z0^md*0#5#@i4~M+L3V;eALNu0a3Tez_7vt`Skh$iyT#^`m6(^FU&RZd6~O63Pm}2u
z3&?}FxKmP#lZ!G7N;32FG?|M)N#YiJeiA4t72je@E=o--N!4To#}Jy|Z?P7qmV_37
z>@EhS1qQ|{F?8qZftA3M3@Ew49jymVGAT?c%$bZSEWJ!PavCc<8L{~lv4c_t2iOzw
znJGoApghNTi!Hl6u_(Q`h#SO(WWgdHP@M6C2v8a+;s;4FLp&k~5)}dw;FtsxAb;G_
z0w*_!>5xJPnrTXtlT(X}ku#4tDApmFM*x(0tTFsfyjj!^pduAec?3#@nv6xN3=9mJ
zQy3W-G${xe9Zb)p<fj(L=jE5gr&eSZmmmiXsQ4{L3L0A?f(Ex~@W25jGEfQvCwYPe
zP8AodC^SSVd5S<02Tn%Nf~QCVOF}Tf^e;*=f{{d&K*<4=w!!6)BN0BvZ=RnfdlATw
zMbaSGfkL!M8N>qBOGO$WmL`Y*CtU;qO2kF73=9k)p<+<M#KFkH%)!dR1{MXS2vAK2
z#-QK?w+2i|Dwk5YS{S0(Q@Dc}G<k0E`lXhGODFOQry@B91_q3hsYo8=GX+R~1r<m|
ziXZ_{2xBjaz##()6IeMUjN&Zn7eb(b1?Mqn`2)^l6c;|~;4}ws<KQfLv_VM?DSMfs
z`j$vj;Moe4r9cT6oUO<!lo8>f4vIA@l{uQ&d;%(P((+65QjiNA1GEq^CmbSJ&4Gsr
zC~ttm1so=zY>3<x#Aw@8@ga(uywq|m#SJKc@D(?ZdIu5pC}jge7}P>C1^E>eU*Lkq
z0<TZ;7z6hz$S4p7d({a`om|3@!irQ!gId6_)-W@;HO!pCmc>%T)XWI4r`i3AKt9II
zBB0v4iYuciHO*G3+Mremqe{BP2Wcxi=jW9qX66;&VoS>}%1tcMWC7RQQM`!2C@so~
z5<n@3ON(-fu+{3;*b-7Q)Q0$+%)IRQq{QUx_>%m16!SpAZ3zl)kY^Ye1sK5<y(iuv
z2kD6?(riCX4y<K7D1#S)T8l-xpn?ySx{=ymprXA9T+nMVFff2JTrs#63MuGWIarE7
z;(nTZx42WlO+RpBz6g}0;Uc9)ImO_P3b;jnixuSRVsL95Tr+}W?-pBbeoAUiF}O_#
oZq|b95U}akoO6rACKud<wga_Ii$TpV9!3F15k?*s0d4^i018QPV*mgE

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