From 5043a39d72ad6a31cea9d06e34daf9bb48ab325a Mon Sep 17 00:00:00 2001
From: lb01545 <lb01545@surrey.ac.uk>
Date: Tue, 6 Dec 2022 06:58:09 +0000
Subject: [PATCH] Added notes
---
db.sqlite3 | Bin 143360 -> 151552 bytes
musicapp/__pycache__/forms.cpython-310.pyc | Bin 1280 -> 1721 bytes
musicapp/__pycache__/models.cpython-310.pyc | Bin 826 -> 1042 bytes
musicapp/__pycache__/urls.cpython-310.pyc | Bin 836 -> 1028 bytes
musicapp/__pycache__/views.cpython-310.pyc | Bin 4210 -> 5358 bytes
musicapp/forms.py | 18 ++++++++-
musicapp/migrations/0004_note.py | 22 +++++++++++
.../__pycache__/0004_note.cpython-310.pyc | Bin 0 -> 838 bytes
musicapp/models.py | 6 ++-
musicapp/static/js/musicapp.js | 2 +-
musicapp/templates/musicapp/detail_view.html | 5 ++-
musicapp/templates/musicapp/note_list.html | 7 ++++
musicapp/templates/musicapp/song_list.html | 2 +-
musicapp/urls.py | 6 +++
musicapp/views.py | 37 +++++++++++++++++-
15 files changed, 98 insertions(+), 7 deletions(-)
create mode 100644 musicapp/migrations/0004_note.py
create mode 100644 musicapp/migrations/__pycache__/0004_note.cpython-310.pyc
create mode 100644 musicapp/templates/musicapp/note_list.html
diff --git a/db.sqlite3 b/db.sqlite3
index a5053360a26b39fbf554edab5285d4ea5a3b9ad6..054531336725256ae66c340ae2ea879fc2e3924c 100644
GIT binary patch
delta 1095
zcmZp8z|pXPbAq&BA_D`1Dgy#IOw=)EOx&2Tgr8ZAD`7IbfHo6X!p24&E+YdmRt8yl
z$K2B5%;dy^0s{jBllZ*+l2juDBO_fyBV7YC1p_lHLvt%r13eRC10zfG&6A{xSj9N`
zZ5a7q@?YWK&0ogf%|DAjiQk{!W@DogzrP?avpOTpK(Jv<f;`AV#rb*ZY(m`3ng~^i
zIZ36t9KtNj+Kh>%B^mJrsYSV&#l@NVc`B2;^*tClCtuOmmKNh;U|`_n4`JZH&A)^H
zIR7gCUjBFdA^d6l6&o9^_=N;nWJTd-f_%X_In90^vkKR}$?Oh}9NZ4va$JA7?rm)B
z<EocYVP#;HSLZCtOf3gH(m63t0mM-NX;e^VWnfg+=1fV=Ni9i*%R{&j6-p2l$r*`x
z=?E1NE?9+>A}a%<tSV<>N($V7#FP}UoXqA}@8vAaD!f6H*#jIoc-weOc$0X8Ha0Tx
zI`gwI$}=L|r6S0}sLY7$5@m=8#451SN_;GgvW#$>6gN+e%`xI;U|?Y6|HQ!miT~<m
z!GtsX({IQ#N%8Y=urUY<GBO$&85xO*@h)a8P}t0vz%0P5!mm4-{emM0zdgStzcIh=
z#>TsR60FROjGQW9QW;Dtfl0;9uJ`vhFbYp+O<+`I;VtEPy<IPXaW@we6U)Lzrus&9
zGj?%rb;d@`%)FG;3Y5eU502~j%#?Tw!?cvd)Ko(hX;tSSSH}=n1y4U0*9ZkA6gf<-
zN(%mdXo{2+G)$FXb|`5!=9{vMtE)3M%a$Z2<)osRhr&^ro|wQW&H{@4=>qPIrh+M{
z#mPmP1tppJc}fZ;sTC#DXXZ1eZ%@x-oEs>{$sf$X|Caw2|1tjU{44o;_{;fI`GYq$
zTJj4CaI!GSio(nWnYTUlJmV4v){p!jz%g+O91}89{D=(707}^m0t^iNzxaRgzuzpF
z@PuCq6oCvpU`1>U47>~s3{3n-8TjAxAKfgNu#?|igNcP9n6V@yvsfXsSfL~%RiQXF
zIX^E&AwMrwAunH{Jh4)tJik0KgM*)ug+Y-qEwiY&1f2XhK-Mwwe`VnR&Hr_?V8Tm&
PZcwyxFtIQ*a&iCwP8~H^
delta 415
zcmZozz}fJCV}i6`00RSqG6MqGP1G@F4A_{kgr8ZIYtm$P0qu>A30#{eNfoh*aPa#x
z^1tN2!oQopjK7<I7Jm}I|Hejhej7m^W_8Bg(&EhI#DaqO;{3dHRv~U?O@vTlPEu(u
zyD$s0He+IGNk)7@YEf=xadBpTp2FmAeGf*C$yfBXB}KUy7#KMC(-`<~^Y7q4&cBMk
zm;W7q8h^#cMnC?^Y4-D&6}V$2vpYC$Y!u<%9OJ!$g;{}j>SXo+$Bm7?yql-S<`{AF
ze_&wbzskUWmH+By!Gx3iI+E;c4D!-Uj9@1yl;`Is7o{ea<QH+Q6Juat5J32xfq{23
zV*#_mVwMB}W(9uN$?O*#H#Yv|+w6LOe*>f7bk+n$RThTEdj0Ks35>hBn3x+jHr6n2
zPtRkV8z{oTpUS}hmj4$2G5+oREBSl)%lT6`Hu~~!Pd(4L#DVoH{|B&pPVrB_A<rZ;
fF@R@M0S6oZ7ye)T?>7r3JmKf#204TWM1U{=bwGC(
diff --git a/musicapp/__pycache__/forms.cpython-310.pyc b/musicapp/__pycache__/forms.cpython-310.pyc
index c8951a640e23a2ab3ffb3e2cada9733ca5bce3e3..4405c762352bfc121ba504c5ea9bf772713c5885 100644
GIT binary patch
delta 947
zcmZqR+R4k8&&$ijz`(#T`$1o_D%(Up8OErI+OqYztWm6t4DJjmEGeul3@NOsj9F~W
z%u(#_3@L0W>@5r_>`)O7cZL*>6wVfg6i%oJX9`y^gC_S&kg1xCw^-Bii*k!!GBPkQ
zXfoeob<9aB&Ar7EoS&C|i^VU$BsCeN4jD5uFfeRfZN$jPKlvVGI-4{D14EJYWN)Ua
ziLwj~41OzFiiANzA|OH(M1X{gAj&{oFiQr+;$UE4U}a!nC}v?`VBla7VlD!SV71Tz
zq@I1UBXemzCj$e+EzY#Wvi#Db%#zewtcf5e7x6MMFjR4Y+^rCjS(1}l#0SzM2=W$F
z5lBywBFK4~T<FdNxu8f4q*xq8Fo6gOkR99}nJFo$d7gO%r6omDAYqWx1(Cc0_J!<Z
zHx~J5kSG0$<Y21M70EL&Fo5u9s8^YaKs-EN1-YB$76&K>CSI4Tw_spkNM(p(Oks#(
zN@b2>NnuQ3N@t2<O=ZhsPhke70#LlqVM*cWWlUvTz_E}ag>w#56f~}@ctPg4<rn4Z
z`KFd6-r`P4Elw`VEGWs$&jSYwB=iJ8suWxhaxWzr7#LpKFfi0JXtEUXgFGhy3K^E7
z{PN;kEXnyf#YNB%Rs~7o2w^sm9BK&P;s{BtC`l|zO)OFZ$-;vdJ>Wp$s?QL_z)%b_
zfP;aBiGz`aiHQ*cIsUM*as4a;DZ&%@Dhvz^x*%JWK?I2Br^z*WE{l9X5y)w`IDPX|
zQgcAT15SY8s3`&|Lvjo#>We_}eT%~;H$SB`C)Ey=Wr{(WlZQcsQHWVcN{kNx^BAbm
delta 511
zcmdnV+rY(_&&$ijz`(%3c&snEi)A9845Q0LZCO7?26u)OmK4?&h7{IR#w^xm<|sCI
zh7`6G_7;W|cBlw@3P&)5Cg)3#eoe+(tZDg0xy3IT85kHenQpN<<|LKo-eL*P&r9F9
z$(@mrZ}Kn3bT%ml28JT3$>~f}on;sp82nbU6bXTZgh7M|hyV!}L6m{GV3st9#m>OM
zz{<eDP|U)>z`(&E#9YKa*`8UJk!^A;b7?&X0|Ub?&a}j`{L-S#lGIzQi6Hxnco-NM
zs<=RoPzcE^$w@8Z1sNp(c4HApPmu!18Jb+^&H&j|Bnnb21|pb1ggD3!Zja2Al+--W
zyn@n_B1w=i$cY(9P6oRc<PAlTYeC-QU|?b5U}RxpVq{|E_{YY=^}7fp?^h%X(~quQ
zj)8$e9;6-WS*9Y8h@U3MWG^;(ms^~^`6;P6Zuv#IMWA2-OClKoa#0b;8MioWa`RJ4
Vb5iX<(NYZZFb{(OqY$&06aaVdTjl@&
diff --git a/musicapp/__pycache__/models.cpython-310.pyc b/musicapp/__pycache__/models.cpython-310.pyc
index e67412b13986934115330a2258aaf0a5e379a805..876b7cf7abf91de8dc9b0132891fdf633778a7b0 100644
GIT binary patch
delta 259
zcmdnRHi?5TpO=@5fq{X+>Rw;6G1Ejo8Ai8>+Qt&@3@L0W>@5r_?5T`dOwG(utSKD9
z44Rx9Q{FK$uACgqG;Q)DMyYxg1_p*yhA74qhA5^~<^?PZ8KPKInX}kZ*;ARbI8qpU
znW8vTn1UHJnQyW9<(H%ui7+rQ_-S$#u`@6*6mftEP7uMwz`$^eGbFX5#4R&5C*>A*
zN@{U(QD#9&W`16g1V{xlh>!#kQXoPAOlX2h5FrR6q!}0(_!t-%irE+#7&sU>7)2P1
fKw^HHY?I$GDKSb<=3-Xk0olsKAjBlZCdLW?6BjZC
delta 67
zcmbQlv5So_pO=@5fq{V`?oeOyX2ywpGK?k@wT;<Q*n$}}**BKGV`S8voXRwf*-w*o
X@?K`8$xoP-xY!sN7<d?jn8ersGnNlO
diff --git a/musicapp/__pycache__/urls.cpython-310.pyc b/musicapp/__pycache__/urls.cpython-310.pyc
index bfdf64b773ec2bac6186dc7b8d83e92e2daa6023..445d5da11a3e00bd76a4a6d8611d92982dea2618 100644
GIT binary patch
delta 321
zcmX@Y*21Bk&&$ijz`(%p|50D^P8J4+#~=<e7GPjtaA06yD1I?fd#yt%V~Thxa~9tM
zwuKBS5-DuG%&CkilBvvD{9q9&sEBkbbCv*DL<S_1&J!h=A{)%0DYx;F2xDXwzfERd
ziB(=^ik*I5eo1QaElv;>pOaZ!QYC~cr=OQvev3P~C^fMpH6Enu7FSAYPHIUin9U7g
zgC+blg(m-GT<y%`mtT_VlUZC6mYG_9i_aOX6(k1XyMT4W`P`*NIR%L&C8<Su#VZ+#
k)EF2Tiqt0WWXe~PV_;z5Vc=opV-aHF14AJuWXSOX03x<sSpWb4
delta 130
zcmZqSIKrl#&&$ijz`($8<Vs(18#4pLV-N=!^D;0nI503U6mOcSy_PGTGm0-oJeWaK
zVzUIJ2qUwfCjaDCrq!a{rA0Xfi6teeMR~<58H(f?7#ND=Cl@p4%SbRVFz_(&F!Heo
OG4X++5EBG)yaNDx_ZSrb
diff --git a/musicapp/__pycache__/views.cpython-310.pyc b/musicapp/__pycache__/views.cpython-310.pyc
index 33dfbf0d4a9a11868e524ab82e51917a6e0c0008..f5417880a60186f9ecadce06bb4322a4863ead91 100644
GIT binary patch
delta 2851
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
Sz$L&bz$3sRz%9Tb!V3Vm^glZQ
delta 1832
zcmaE-`ALB<pO=@5fq{YH+?BrM4!((eGE6TRChGXqGcu$wq_E}i=L$p#fZ6Ohg1JIb
zLW~S4EGZm0!nq<*BDtbbqKphFoGDx_3{hh43@O|xJS_|<JgLmh%u(VgyeWJw3{es(
z{3!x03{jFPf+<2R3{g_<3@O4XA}tIlBB_kc%u&+r3@M^1Vl50QVyR5c%uzD#3@PF%
ziV`ghDH5qH&CF4<?hGlCDN-#ADN<m*T#9rsgQm>n0LCgYrdynjIZ36tZuv#Iw>X0H
z^U^`A$^RK;_%)esv4Z7pv4F%UOEV=i3QVqN(q$B%yq2k!QF5|9pUh-;=1fM5$s3u?
z*=m@A88q1@v$1F;YqAvyFfcF_2{SM-++t2oExE;(U7lE!UR)#y5@Acr%qdAN(qz8H
zQk<HTR-_D4D+VIO;e-T8p+I_SNqlmCUP)?2NqkCTNg_zJn1g|Vfo1YimOyWiCAU~}
z^HWlDZt<3+<`(26mZZk#CFZ6UsliP`HM2;Hfq?<!F0e5i3@nT+Ogv0QQj;B7|1s)J
zc3_iX<ewbNrt2vRG63u-JrE1klv~`%MX4aW$}&^S6&M&8ibX(<V&r4wV&q`tU=#ph
zCJrVZ#v-%Hm)Y7GWhO_nn=<N6p2)72337E256Dm*5Mc-+j6eiGh%g2bCLjXj&mwjP
z1_n*mBCu;LL82fh-D1v9$|}O@uF`@On7i~RD{x3NT2Hp&2&|W3U|^`?1xKfXOKMJP
zNoq=wF34#1A~ukzAUEA&O99IiVR45hGm;amKswL^1fn+{6d*3300Ft4hlztpfRTf#
zh|w05SQv{ZYjOH9Do*ASkYOqonf#wi)GwGpli9Bb>@#_gdsx6p1e|h;R6zEC630r$
zB2^F@%}yRr@+d4#EvhU|EeQr$I{6o;YN|R&sRoG91QDPlSEL1EX@k;~Ff2XgCuOB3
zmq1dB14tTSI+z7YYejYp3=DoClR<eLoLU%J7<rhA?4bTx$Ysx{Klve-3}f-+e_RTo
znk-PyfC9Wo4&ozF;6i+)1hNO@BTXiVk3cGlz}A5Yke#=<LEg&D%Ph%E%!vWnJ-L|M
zma%y9Ms6uHO;*1m3y>kwAOaL@nvCH5qsdgn2ND7qUStnqfei!`5|bHuL|7BRMoIB#
zW#9}TUQhsWrR5jp#wX__78e(RLafLcWEv<=ksJy!7bM}tz`zg=G8&YkVIjo9#KThL
z1PY_cCwOKuN>5JW)$s&-9-P|1QQ`&C4Nmu<uwBUl2@r5X_XfFxr8qw?9mz^i*c5@x
zNSS<{SJxWN6CepB#R&JgGcYhDGcYiGW?^7p;9%fkEOMW0&nL_1HaV7Wdc6n85uOYT
z3~riCxA>rGxVSVqIkmXB2;__+ACL-P1_p)@P4*&x5C?1(*bAU?<Q9)hermB_eu-;E
zW^qXo$S*}UAY}m{0_+Yj0e5~5D6l|Df`^f5axuTMUJ$B6gz69m28L{qBq(hcfp~tJ
z@{`vK7uVn7PRUBlOV8IUEy^hdNBk{5s0b)|7iA`aGx04paM@T4DUHESmIRpxDg%qm
zKrCwzVGANaDZL03nMI%w1KWlzJa2K><mT(8l;)(`F@ih-D*PlEL>L7a1sHi4c|au}
VlK>Y7F9$z|r~sD$rvQ%#2LKgUVZ{Id
diff --git a/musicapp/forms.py b/musicapp/forms.py
index cf11913..21fc5d8 100644
--- a/musicapp/forms.py
+++ b/musicapp/forms.py
@@ -1,5 +1,5 @@
from django import forms
-from .models import Album, Song
+from .models import Album, Song, Note
# creating a form
class AlbumForm(forms.ModelForm):
@@ -40,4 +40,20 @@ class SongForm(forms.ModelForm):
'placeholder': 'Song Title',
}),
'album': forms.HiddenInput(),
+}
+
+class NoteForm(forms.ModelForm):
+ # create meta class
+ class Meta:
+ # specify model to be used
+ model = Note
+ fields = ['description', 'album']
+ widgets = {
+ 'description': forms.Textarea(attrs={
+ 'class': 'formfield',
+ 'placeholder': 'Note Description',
+ 'rows' : 25,
+ 'cols' : 60,
+ }),
+ 'album': forms.HiddenInput(),
}
\ No newline at end of file
diff --git a/musicapp/migrations/0004_note.py b/musicapp/migrations/0004_note.py
new file mode 100644
index 0000000..38b0cfa
--- /dev/null
+++ b/musicapp/migrations/0004_note.py
@@ -0,0 +1,22 @@
+# Generated by Django 4.1.1 on 2022-12-06 06:17
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('musicapp', '0003_song'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Note',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('description', models.TextField()),
+ ('album', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='musicapp.album')),
+ ],
+ ),
+ ]
diff --git a/musicapp/migrations/__pycache__/0004_note.cpython-310.pyc b/musicapp/migrations/__pycache__/0004_note.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0f0bceb36e7fc473f623a17b76d9be06da703e38
GIT binary patch
literal 838
zcmd1j<>g{vU|^`d*O%PD#K7<v#6iX^3=9ko3=9m#dJGH<DGVu$ISjdsQH;4vQA~^=
zK2r{J6pK4U3Udle3quM^Dq|LFGjkMc3R5tHChJR(Nt#TzxN<YoixNvR^Ye;tvE}Bc
zq~;X+C4=OUF(=HX2nGg*RE8+V6ox3K6vlMMDCSg_EY=jJ6y{X6EcO(Z6qXd$6t)!h
zUY0bb6pmE31sn?*(wI^>Q`xdOQ@OIZv)HnDvUpRtQn-7W(wNejQ+Rrr(ix-pQh0+I
zH2H3E`obKe$#jb&x3oAjIkBMN7N>!MfpL6seqQ=57Qg(G)LTrMDIspRm^@uHS#I$p
zmX_qlCl{qAmZYZK;w~u4%uOt+jL%N3yv13ZT9lcXlUbE|i>EBLC@H@<H9jvfH}w{G
zN@{U(QDy<i+qYN~bCODPtN38n>4Ev0Ot(1m^Wsxdb5cPTmgH+P-C_Z2W=qRV%}FWt
z)8xO!5f3&mKK>S0e0*+xN@-4NeEcn*`1r!o#2k=f5HBUQAT=)~H7_|cwYZ3hfq~%`
zw=>wazM#-9Vg`xuIAx|gmX_qZfsDSz8IoF20%3Bw<rk%9rssL5R^DPu$x6&i&%ec#
zl5~p$?6A!Iyj$$fj=|23F0Qw@@(WU-F}aeVNRfd7Lj20sFD*_j()S29F)-B6Nir}r
zH8ItXOie6`H_~_Z_cbywGF8x32v1E?a4aau$xMbM1_hVYvecaXg51=+5`E`zeQ@YN
z$i#vIeMG9!H!v_TiO<U~N!2T;ECQuTc2JrWV_;z5U|?cq`Om`2#3;hV#VEnZ^q1uy
z$A7RIO}1N{5bx-vB!NQ(5)hJbK|M%f)Ps4nNCxC1kogF|L0C$l5ah6dgufjl$aXdc
M1_l8p4n{F%08riVcK`qY
literal 0
HcmV?d00001
diff --git a/musicapp/models.py b/musicapp/models.py
index 83d1bb1..afdcb95 100644
--- a/musicapp/models.py
+++ b/musicapp/models.py
@@ -9,4 +9,8 @@ class Album(models.Model):
class Song(models.Model):
title = models.CharField(max_length = 128)
favourite = models.BooleanField(default=False)
- album = models.ForeignKey(Album, on_delete=models.CASCADE)
\ No newline at end of file
+ album = models.ForeignKey(Album, on_delete=models.CASCADE)
+
+class Note(models.Model):
+ description = models.TextField()
+ album = models.ForeignKey(Album, on_delete=models.CASCADE)
diff --git a/musicapp/static/js/musicapp.js b/musicapp/static/js/musicapp.js
index 879b385..c7d65dc 100644
--- a/musicapp/static/js/musicapp.js
+++ b/musicapp/static/js/musicapp.js
@@ -21,7 +21,7 @@ async function togglefavourite(song_id){
});
}
-async function delete_t(song_id){
+async function delete_s(song_id){
$.ajax({
url: '/albums/deletesong',
type: 'get',
diff --git a/musicapp/templates/musicapp/detail_view.html b/musicapp/templates/musicapp/detail_view.html
index a88a786..4c1768d 100644
--- a/musicapp/templates/musicapp/detail_view.html
+++ b/musicapp/templates/musicapp/detail_view.html
@@ -12,7 +12,10 @@
</hr>
{% include 'musicapp/song_list.html' with nid=album.id %}
- <input type="button" onclick="location.href='{% url 'create_song' album.id %}';" value="New Song" />
+ <input type="button" onclick="location.href='{% url 'create_song' album.id %}';" value="New Song" /><br><br><br>
+
+ {% include 'musicapp/note_list.html' with nid=album.id %}
+ <input type="button" onclick="location.href='{% url 'create_note' album.id %}';" value="New Note" />
</body>
{% endblock content %}
diff --git a/musicapp/templates/musicapp/note_list.html b/musicapp/templates/musicapp/note_list.html
new file mode 100644
index 0000000..b92f1ea
--- /dev/null
+++ b/musicapp/templates/musicapp/note_list.html
@@ -0,0 +1,7 @@
+<h3>Notes</h3>
+
+{% for note in note_list %}
+
+ <p> {{note.description}} </p>
+
+{% endfor %}
diff --git a/musicapp/templates/musicapp/song_list.html b/musicapp/templates/musicapp/song_list.html
index c37698f..747f889 100644
--- a/musicapp/templates/musicapp/song_list.html
+++ b/musicapp/templates/musicapp/song_list.html
@@ -9,7 +9,7 @@
{% else %}
<div class="song_prompt not_favourite" id="sid_{{song.id}}" onClick='togglefavourite({{ song.id }})'>{{song.title}}
{% endif %}
- <button class="song_button" onClick='event.stopPropagation();delete_t({{ song.id }});' type='button'>X</button>
+ <button class="song_button" onClick='event.stopPropagation();delete_s({{ song.id }});' type='button'>X</button>
</div>
<hr/>
{% endfor %}
diff --git a/musicapp/urls.py b/musicapp/urls.py
index eb823e3..2c52217 100644
--- a/musicapp/urls.py
+++ b/musicapp/urls.py
@@ -20,4 +20,10 @@ urlpatterns = [
path('togglefavourite', views.FavouriteSongView.as_view(), name='favourite_song'),
#/albums/deletesong
path('deletesong', views.DeleteSongView.as_view(), name='delete_song'),
+ #albums/id/notes/
+ path('<int:nid>/notes', views.NoteListView.as_view(), name='note_list'),
+ #albums/id/note/new
+ path('<int:nid>/note/new', views.CreateNoteView.as_view(), name='create_note'),
+ #/albums/deletenote
+ path('deletenote', views.DeleteNoteView.as_view(), name='delete_note'),
]
diff --git a/musicapp/views.py b/musicapp/views.py
index 177e265..250bca0 100644
--- a/musicapp/views.py
+++ b/musicapp/views.py
@@ -1,10 +1,10 @@
from django.views.generic import ListView, CreateView, DetailView, View
from django.shortcuts import (get_object_or_404, render, redirect)
from django.http import HttpResponse, JsonResponse
-from .forms import AlbumForm, SongForm
+from .forms import AlbumForm, SongForm, NoteForm
+from .models import Album, Song, Note
from django.urls import reverse_lazy
from django.contrib import messages
-from .models import Album, Song
def index_view(request):
# dictionary for initial data with
@@ -25,6 +25,7 @@ class AlbumDetailView(DetailView):
context = {}
context['album'] = Album.objects.get(id=self.kwargs['pk'])
context['song_list'] = Song.objects.filter(album__id=self.kwargs['pk'])
+ context['note_list'] = Note.objects.filter(album__id=self.kwargs['pk'])
return context
@@ -113,3 +114,35 @@ class DeleteSongView(View):
return JsonResponse({'delete_success': False, 'sid': sid}, status=200)
song.delete()
return JsonResponse({'delete_success': True, 'sid': sid}, status=200)
+
+
+class NoteListView(ListView):
+ model = Note
+ template_name = 'musicapp/note_list.html'
+ context_object_name = 'note_list'
+
+ def get_queryset(self):
+ return Note.objects.filter(album__id=self.kwargs['nid'])
+
+class CreateNoteView(CreateView):
+ model = Note
+ form_class = NoteForm
+ template_name = "musicapp/create_view.html"
+
+ def get_initial(self): # set the initial value of our album field
+ album = Album.objects.get(id=self.kwargs['nid'])
+ return {'album': album}
+
+ def get_success_url(self): # redirect to the album detail view on success
+ return reverse_lazy('albums_detail', kwargs={'pk':self.kwargs['nid']})
+
+
+class DeleteNoteView(View):
+ def get(self, request):
+ nid = request.GET.get('note_id')
+ try:
+ note = Note.objects.get(pk=nid)
+ except Song.DoesNotExist:
+ return JsonResponse({'delete_success': False, 'nid': nid}, status=200)
+ note.delete()
+ return JsonResponse({'delete_success': True, 'nid': nid}, status=200)
--
GitLab