Commit 21b7128b authored by Jayson Lim's avatar Jayson Lim

Merge branch 'announcementsv2' into 'main'

Announcementsv2

See merge request !18
parents 25646d55 21a5be82
...@@ -27,6 +27,6 @@ https://stackoverflow.com/questions/6540032/sorting-related-items-in-a-django-te ...@@ -27,6 +27,6 @@ https://stackoverflow.com/questions/6540032/sorting-related-items-in-a-django-te
(sgd) Joaquin Crisologo, 7 May, 2023 (sgd) Joaquin Crisologo, 7 May, 2023
(sgd) Andrew Idquival, 28 February, 2023 (sgd) Andrew Idquival, 28 February, 2023
(sgd) Jayson Lim, 28 February, 2023 (sgd) Jayson Lim, 8 May, 2023
(sgd) Almira Redoble, 1 May, 2023 (sgd) Almira Redoble, 1 May, 2023
(sgd) Neptune Sy, 28 February, 2023 (sgd) Neptune Sy, 28 February, 2023
\ No newline at end of file
# Generated by Django 3.2 on 2023-03-05 07:28
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('dashboard', '0001_initial'),
('announcementBoard', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='announcement',
name='author',
field=models.ForeignKey(default=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='announcements', to='dashboard.widgetuser'),
),
migrations.AlterField(
model_name='reaction',
name='annoucement',
field=models.ForeignKey(default=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reactions', to='announcementBoard.announcement'),
),
migrations.AlterField(
model_name='reaction',
name='name',
field=models.CharField(choices=[('Like', 'Like'), ('Love', 'Love'), ('Angry', 'Angry')], default='Like', max_length=5),
),
migrations.AlterField(
model_name='reaction',
name='tally',
field=models.PositiveIntegerField(default=0),
),
]
# Generated by Django 3.2 on 2023-03-05 09:46
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('dashboard', '0001_initial'),
('announcementBoard', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='announcement',
name='author',
field=models.ForeignKey(default=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='announcements', to='dashboard.widgetuser'),
),
migrations.AlterField(
model_name='reaction',
name='annoucement',
field=models.ForeignKey(default=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reactions', to='announcementBoard.announcement'),
),
migrations.AlterField(
model_name='reaction',
name='name',
field=models.CharField(choices=[('Like', 'Like'), ('Love', 'Love'), ('Angry', 'Angry')], default='Like', max_length=5),
),
migrations.AlterField(
model_name='reaction',
name='tally',
field=models.PositiveIntegerField(default=0),
),
]
# Generated by Django 3.2 on 2023-03-05 11:15
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('announcementBoard', '0002_auto_20230305_1528'),
('announcementBoard', '0002_auto_20230305_1746'),
]
operations = [
]
from django.urls import path
from .views import index
urlpatterns = [
path('', index, name='index'),
]
app_name = "announcementBoard"
\ No newline at end of file
from django.shortcuts import render
from django.http import HttpResponse
from .models import Announcement
from dashboard.models import WidgetUser
def index(request):
head = "<h1 style='border-bottom:4px solid lightgray;\
padding-bottom:30px;\
font-size:450%;'>\
Widget's Announcement Board\
</h1>"
body = "<h2>Announcements:</h2>"
for x in Announcement.objects.all():
reaction = x.reactions.all()
body += "<p style='border: 2px solid gray;\
border-radius:5px;\
padding:20px 30px;'>\
{} by {} {} published {}:\
<br>\
{}\
</p>".format(x.title, x.author.first_name, x.author.last_name,
x.format_pub_datetime(), x.body)
for y in reaction:
body += "<p>{}: {}\
</p>".format(y.name, y.tally)
body += '<p>&nbsp;</p>'
return_string = "<html>\
<body style = 'font-family:helvetica;\
padding:30px;'>\
{}{}\
</body></html>".format(head, body)
return HttpResponse(return_string)
...@@ -23,9 +23,9 @@ class AnnouncementAdmin(admin.ModelAdmin): ...@@ -23,9 +23,9 @@ class AnnouncementAdmin(admin.ModelAdmin):
class ReactionAdmin(admin.ModelAdmin): class ReactionAdmin(admin.ModelAdmin):
model = Reaction model = Reaction
list_display = ('name', 'tally', 'annoucement') list_display = ('name', 'tally', 'announcement')
search_fields = ('name', 'annoucement') search_fields = ('name', 'announcement')
list_filter = ('name', 'annoucement') list_filter = ('name', 'announcement')
admin.site.register(Announcement, AnnouncementAdmin) admin.site.register(Announcement, AnnouncementAdmin)
......
...@@ -3,4 +3,4 @@ from django.apps import AppConfig ...@@ -3,4 +3,4 @@ from django.apps import AppConfig
class AnnouncementboardConfig(AppConfig): class AnnouncementboardConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField' default_auto_field = 'django.db.models.BigAutoField'
name = 'announcementBoard' name = 'announcements'
# Generated by Django 3.2 on 2023-03-04 07:17 # Generated by Django 3.2 on 2023-05-11 07:09
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
...@@ -20,16 +20,16 @@ class Migration(migrations.Migration): ...@@ -20,16 +20,16 @@ class Migration(migrations.Migration):
('title', models.CharField(default='', max_length=250)), ('title', models.CharField(default='', max_length=250)),
('body', models.TextField(blank=True, null=True)), ('body', models.TextField(blank=True, null=True)),
('pub_datetime', models.DateTimeField(auto_now_add=True)), ('pub_datetime', models.DateTimeField(auto_now_add=True)),
('author', models.ForeignKey(default=True, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='dashboard.widgetuser')), ('author', models.ForeignKey(default=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='announcements', to='dashboard.widgetuser')),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
name='Reaction', name='Reaction',
fields=[ fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=10)), ('name', models.CharField(choices=[('Like', 'Like'), ('Love', 'Love'), ('Angry', 'Angry')], default='Like', max_length=5)),
('tally', models.IntegerField(default=0)), ('tally', models.PositiveIntegerField(default=0)),
('annoucement', models.ForeignKey(default=True, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='announcementBoard.announcement')), ('announcement', models.ForeignKey(default=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reactions', to='announcements.announcement')),
], ],
), ),
] ]
from django.db import models from django.db import models
from dashboard.models import WidgetUser from dashboard.models import WidgetUser
from django.urls import reverse
class Announcement(models.Model): class Announcement(models.Model):
...@@ -12,20 +13,23 @@ class Announcement(models.Model): ...@@ -12,20 +13,23 @@ class Announcement(models.Model):
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name='announcements', related_name='announcements',
) )
pub_datetime = models.DateTimeField(auto_now_add=True) pub_datetime = models.DateTimeField(auto_now_add=True, editable=False)
def __str__(self): def __str__(self):
return self.title return self.title
def format_pub_datetime(self): def format_pub_datetime(self):
return self.pub_datetime.strftime('%m/%d/%Y, %I:%M %p') return self.pub_datetime.strftime('%m/%d/%Y, %I:%M %p')
def get_absolute_url(self):
return reverse('announcements:announcements-detail', kwargs={'pk': self.pk})
class Reaction(models.Model): class Reaction(models.Model):
name = models.CharField(max_length=5, choices=[('Like', 'Like'), name = models.CharField(max_length=5, choices=[('Like', 'Like'),
('Love', 'Love'), ('Love', 'Love'),
('Angry', 'Angry')], default='Like') ('Angry', 'Angry')], default='Like')
tally = models.PositiveIntegerField(default=0) tally = models.PositiveIntegerField(default=0)
annoucement = models.ForeignKey( announcement = models.ForeignKey(
Announcement, Announcement,
null=True, null=True,
default=True, default=True,
......
{% extends 'base.html' %}
{% load static %}
{% block title %} Add Announcement {% endblock %}
{% block heading %}
<h1 class="subheader"> Add a new announcement: </h1>
{% endblock %}
{% block content %}
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<div class="separator-bar"></div>
<input class="action-button" type="submit" value="Add Announcement">
</form>
{% endblock %}
{% extends 'base.html' %}
{% load static %}
{% block title %} {{ object.title }} {% endblock %}
{% block heading %}
<h1> {{ object.title }} </h1>
<h2> by {{ object.author.first_name }} {{ object.author.last_name }} </h2>
<h4> {{ object.format_pub_datetime }} </h4>
<p class="detail-body"> {{ object.body }} </p>
<div class="separator-bar"></div>
{% for reaction in object.reactions.all %}
<p class="detail-additionalinfo">
{{ reaction.name }}: {{ reaction.tally }}
</p>
{% endfor %}
<div class="separator-bar"></div>
<button class="action-button" onclick="window.location.href='{% url 'announcements:announcements-edit' pk=object.pk %}'">
Edit Announcement
</button>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% load static %}
{% block title %} Edit Anouncement {% endblock %}
{% block heading %}
<h1 class="subheader"> Edit Announcement: </h1>
{% endblock %}
{% block content %}
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<br>
<div class="separator-bar"></div>
<input class="action-button" type="submit" value="Save Changes to Announcement">
</form>
{% endblock %}
{% extends 'base.html' %}
{% load static %}
{% block title %} Widget's Announcement Board {% endblock %}
{% block heading %}
<h1 id="header"> Welcome to Widget's Announcement Board! </h1>
{% endblock %}
{% block content %}
<h2 class="subheader"> Announcements: </h2>
<ul>
{% for object in announcements|dictsortreversed:"pub_datetime" %}
<li class="object-cell">
<a href="{{ object.get_absolute_url }}"> <span class="object-title">{{ object.title }}</span> by
{{ object.author.first_name}} {{ object.author.last_name }}
</a>
</li>
{% endfor %}
</ul>
<hr>
<button onclick="window.location.href='{% url 'announcements:announcements-add' %}'" class="action-button">
New Announcement
</button>
<div id="footer">
<a href="{% url 'dashboard:index' %}">Dashboard</a>
<a href="{% url 'forum:index' %}">Forum</a>
<a href="{% url 'assignments:homePage' %}">Assignments</a>
<a href="{% url 'widget_calendar:index' %}">Calendar</a>
</div>
{% endblock %}
from django.urls import path
from .views import index, AnnouncementsDetailView, AnnouncementsCreateView, AnnouncementsUpdateView
urlpatterns = [
path('', index, name='index'),
path('announcements/<int:pk>/details', AnnouncementsDetailView.as_view(), name='announcements-detail'),
path('announcements/add', AnnouncementsCreateView.as_view(), name = 'announcements-add'),
path('announcements/<int:pk>/edit', AnnouncementsUpdateView.as_view(), name = 'announcements-edit')
]
app_name = "announcements"
\ No newline at end of file
from django.shortcuts import render
from django.http import HttpResponse
from .models import Announcement
from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView, UpdateView
from dashboard.models import WidgetUser
def index(request):
announcements = Announcement.objects.all()
return render(request, 'announcements/announcements.html', {'announcements':announcements})
class AnnouncementsDetailView(DetailView):
model = Announcement
template_name = 'announcements/announcement-details.html'
class AnnouncementsCreateView(CreateView):
model = Announcement
template_name = 'announcements/announcement-add.html'
fields = ["title", "body", "author"]
class AnnouncementsUpdateView(UpdateView):
model = Announcement
template_name = 'announcements/announcement-edit.html'
fields = '__all__'
\ No newline at end of file
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
{% block navigation %} {% block navigation %}
<button class="buttonLink" onclick="window.location.href='add/';"> <b>New Assignment</b> </button><br><br> <button class="buttonLink" onclick="window.location.href='add/';"> <b>New Assignment</b> </button><br><br>
<a class="miniLink" href="/dashboard"> Dashboard </a> <br> <a class="miniLink" href="/dashboard"> Dashboard </a> <br>
<a class="miniLink" href="/announcementBoard"> Announcements </a> <br> <a class="miniLink" href="/announcements"> Announcements </a> <br>
<a class="miniLink" href="/forum"> Forum </a> <br> <a class="miniLink" href="/forum"> Forum </a> <br>
<a class="miniLink" href="/widget_calendar"> Calendar </a> <br> <a class="miniLink" href="/widget_calendar"> Calendar </a> <br>
{% endblock %} {% endblock %}
\ No newline at end of file
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
</button> </button>
</div> </div>
<div id="footer"> <div id="footer">
<a href="{% url 'announcementBoard:index' %}">Announcement Board</a> <a href="{% url 'announcements:index' %}">Announcement Board</a>
<a href="{% url 'forum:index' %}">Forum</a> <a href="{% url 'forum:index' %}">Forum</a>
<a href="{% url 'assignments:homePage' %}">Assignments</a> <a href="{% url 'assignments:homePage' %}">Assignments</a>
<a href="{% url 'widget_calendar:index' %}">Calendar</a> <a href="{% url 'widget_calendar:index' %}">Calendar</a>
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
<button onclick="window.location.href='{% url 'forum:forumpost-add' %}';" class="action-button"> New Post </button> <button onclick="window.location.href='{% url 'forum:forumpost-add' %}';" class="action-button"> New Post </button>
<div id="footer"> <div id="footer">
<a href="{% url 'dashboard:index' %}">Dashboard</a> <a href="{% url 'dashboard:index' %}">Dashboard</a>
<a href="{% url 'announcementBoard:index' %}">Announcements</a> <a href="{% url 'announcements:index' %}">Announcements</a>
<a href="{% url 'assignments:homePage' %}">Assignments</a> <a href="{% url 'assignments:homePage' %}">Assignments</a>
<a href="{% url 'widget_calendar:index' %}">Calendar</a> <a href="{% url 'widget_calendar:index' %}">Calendar</a>
</div> </div>
......
...@@ -43,7 +43,7 @@ INSTALLED_APPS = [ ...@@ -43,7 +43,7 @@ INSTALLED_APPS = [
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'dashboard', 'dashboard',
'assignments', 'assignments',
'announcementBoard', 'announcements',
'forum', 'forum',
'widget_calendar', 'widget_calendar',
] ]
......
...@@ -21,6 +21,6 @@ urlpatterns = [ ...@@ -21,6 +21,6 @@ urlpatterns = [
path('', include('dashboard.urls', namespace="dashboard")), path('', include('dashboard.urls', namespace="dashboard")),
path('widget_calendar/', include('widget_calendar.urls', namespace="widget_calendar")), path('widget_calendar/', include('widget_calendar.urls', namespace="widget_calendar")),
path('assignments/', include('assignments.urls', namespace="assignments")), path('assignments/', include('assignments.urls', namespace="assignments")),
path('announcementBoard/', include('announcementBoard.urls', namespace="announcementBoard")), path('announcements/', include('announcements.urls', namespace="announcements")),
path('forum/', include('forum.urls', namespace="forum")), path('forum/', include('forum.urls', namespace="forum")),
] ]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment