diff --git a/db.sqlite3 b/db.sqlite3
index a5053360a26b39fbf554edab5285d4ea5a3b9ad6..054531336725256ae66c340ae2ea879fc2e3924c 100644
Binary files a/db.sqlite3 and b/db.sqlite3 differ
diff --git a/musicapp/__pycache__/forms.cpython-310.pyc b/musicapp/__pycache__/forms.cpython-310.pyc
index c8951a640e23a2ab3ffb3e2cada9733ca5bce3e3..4405c762352bfc121ba504c5ea9bf772713c5885 100644
Binary files a/musicapp/__pycache__/forms.cpython-310.pyc and b/musicapp/__pycache__/forms.cpython-310.pyc differ
diff --git a/musicapp/__pycache__/models.cpython-310.pyc b/musicapp/__pycache__/models.cpython-310.pyc
index e67412b13986934115330a2258aaf0a5e379a805..876b7cf7abf91de8dc9b0132891fdf633778a7b0 100644
Binary files a/musicapp/__pycache__/models.cpython-310.pyc and b/musicapp/__pycache__/models.cpython-310.pyc differ
diff --git a/musicapp/__pycache__/urls.cpython-310.pyc b/musicapp/__pycache__/urls.cpython-310.pyc
index bfdf64b773ec2bac6186dc7b8d83e92e2daa6023..445d5da11a3e00bd76a4a6d8611d92982dea2618 100644
Binary files a/musicapp/__pycache__/urls.cpython-310.pyc and b/musicapp/__pycache__/urls.cpython-310.pyc differ
diff --git a/musicapp/__pycache__/views.cpython-310.pyc b/musicapp/__pycache__/views.cpython-310.pyc
index 33dfbf0d4a9a11868e524ab82e51917a6e0c0008..f5417880a60186f9ecadce06bb4322a4863ead91 100644
Binary files a/musicapp/__pycache__/views.cpython-310.pyc and b/musicapp/__pycache__/views.cpython-310.pyc differ
diff --git a/musicapp/forms.py b/musicapp/forms.py
index cf11913cac2f7f4e0ecc1eac8602a1b39f32319c..21fc5d8ca12fe9024449f46e88e8874e2de88d66 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 0000000000000000000000000000000000000000..38b0cfa11d1539d9a29515693319db50950e4cd6
--- /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
Binary files /dev/null and b/musicapp/migrations/__pycache__/0004_note.cpython-310.pyc differ
diff --git a/musicapp/models.py b/musicapp/models.py
index 83d1bb14c0aad8c465dc7c986f168f2ad8ddfad4..afdcb9532991bb42f30ceffaba58d5858fee03ee 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 879b38590ef93cac54db43da3d48a64f0416032b..c7d65dce8e015087f9965959eda7bd68e82d1e10 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 a88a786df73f174ae2abab305d96b03ba77c4e5f..4c1768d777253e45c38f26228a75985bcb38eca1 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 0000000000000000000000000000000000000000..b92f1ea65180131d10f847d3996c4c1dd4f6390e
--- /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 c37698f65ecd9052b462fc1a329284a95e3fa77e..747f889e54d2d346b650355d7f68174afe0afc87 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 eb823e32dfda309deb75478877c2de2d42a99dd7..2c52217caac45f2e344f765702fd9ce5573531f0 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 177e2651bdadf7f64aaa078123325b177470f916..250bca0d9326153217142093e25725a7af84cfa2 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)