diff --git a/app/item/models.py b/app/item/models.py index 8609dc8..f114b38 100644 --- a/app/item/models.py +++ b/app/item/models.py @@ -83,6 +83,16 @@ class Item(models.Model): ) return week, archive + def get_week(self): + return int(self.published.strftime('%W')) + + def get_year(self): + return int(self.published.strftime('%Y')) + + def get_monday(self): + d = '%s-W%s' % (self.get_year(), self.get_week()) + return datetime.strptime(d + '-1', "%Y-W%W-%w").strftime('%Y-%m-%d') + def get_absolute_url(self): return reverse('item', kwargs={'id': self.id}) diff --git a/app/item/tasks.py b/app/item/tasks.py index c2ff2a1..f51091a 100644 --- a/app/item/tasks.py +++ b/app/item/tasks.py @@ -52,6 +52,15 @@ def announce_items(): os.unlink(f.name) +@app.task(queue="default", ignore_results=True) +def notify_telegram(message): + if getattr(settings, "TELEGRAM_ANNOUNCE_CHANNEL"): + r = telegram_rpc.send( + message, + channel=settings.TELEGRAM_ANNOUNCE_CHANNEL + ) + + @app.task(queue="default", ignore_results=True) def notify_moderators(id, link): comment = models.Comment.objects.filter(id=id).first() @@ -69,6 +78,10 @@ def notify_moderators(id, link): rpc.send_reaction( account, comment.data["moderator_ts"], "🎉", group=group ) + msg = '%s commented on %s at %s' % ( + comment.name, comment.item.title, link, link + ) + notify_telegram.delay(msg) else: print("failed to notify", r) diff --git a/app/item/views.py b/app/item/views.py index 7f6d28f..27be4b0 100644 --- a/app/item/views.py +++ b/app/item/views.py @@ -4,7 +4,7 @@ import json from django.utils import timezone from django.utils.timezone import datetime, timedelta -from django.shortcuts import render +from django.shortcuts import render, redirect from django.db.models import Q from django.utils.html import mark_safe from django.conf import settings @@ -23,6 +23,31 @@ def get_now(): return timezone.make_aware(datetime.now(), timezone.get_default_timezone()) +def get_monday(date): + d = date.strftime('%Y-W%W-1') + return datetime.strptime(d, "%Y-W%W-%w").strftime('%Y-%m-%d') + + +def format_week(week): + a = datetime.strptime(week, '%Y-%m-%d') + b = (a + timedelta(days=6)) + fmt = '%b %d' + a = a.strftime(fmt) + b = b.strftime(fmt) + return '%s - %s' % (a, b) + + +def get_weeks(archive): + weeks = sorted(set(archive.values_list('year', 'week'))) + weeks = [datetime.strptime('%s-W%s-1' % w, "%Y-W%W-%w").strftime('%Y-%m-%d') for w in weeks] + weeks = [{ + 'date': week, + 'year': week.split('-')[0], + 'title': format_week(week) + } for week in weeks] + return weeks + + def index(request): context = default_context(request) now = request.GET.get("now") @@ -36,7 +61,7 @@ def index(request): week, archive = models.Item.public(now) context['items'] = week if archive.exists(): - context['archive'] = '/_%s/' % get_now().year + context['archive'] = '/_%s/' % get_monday(get_now() - timedelta(days=7)) if now: context['now'] = now context['previous_week'] = (now - timedelta(days=7)).strftime(TS_FORMAT) @@ -44,11 +69,26 @@ def index(request): return render(request, 'index.html', context) -def archive(request, year=None, week=None): +def archive(request, year=None, month=None, day=None, week=None): context = default_context(request) - qs = models.Item.public() - week, archive = models.Item.public() - context['items'] = archive + _, archive = models.Item.public() + if year and month and day: + date = datetime.strptime('%s-%s-%s' % (year, month, day), '%Y-%m-%d') + week = int(date.strftime('%W')) + year = int(year) + archive_week = archive.filter(year=year, week=week).order_by('published') + context['weeks'] = get_weeks(archive) + context['this_week'] = date.strftime('%Y-%m-%d') + context['this_year'] = date.strftime('%Y') + elif week: + week = int(week) + year = int(year) + week = datetime.strptime('%s-W%s-1' % (year, week), "%Y-W%W-%w").strftime('%Y-%m-%d') + return redirect('/_%s/' % week) + elif year: + week = datetime.strptime('%s-W1-1' % year, "%Y-W%W-%w").strftime('%Y-%m-%d') + return redirect('/_%s/' % week) + context['items'] = archive_week return render(request, 'archive.html', context) @@ -131,6 +171,11 @@ def publish_comment(request): send_reaction( account, comment.data["moderator_ts"], "🎉", group=group ) + link = request.build_absolute_uri(comment.item.get_absolute_url()) + msg = '%s commented on %s at %s' % ( + comment.name, comment.item.title, link, link + ) + tasks.notify_telegram.delay(msg) response['status'] = 'ok' else: response['error'] = 'permission denied' diff --git a/app/static/css/site.scss b/app/static/css/site.scss index ca0783f..b92da2d 100644 --- a/app/static/css/site.scss +++ b/app/static/css/site.scss @@ -134,6 +134,10 @@ header { } } } +.weeks { + text-align: center; + padding-bottom: 32px; +} nav.overlay { position: absolute; diff --git a/app/templates/archive.html b/app/templates/archive.html index 0c93cec..dccdff0 100644 --- a/app/templates/archive.html +++ b/app/templates/archive.html @@ -18,5 +18,32 @@ {% endif %} + {% if weeks %} +
+
+ {% for week in weeks %} + {% ifchanged week.year %} +
+

{{ week.year }}

+ + +
+ {% endif %} {% endblock %} diff --git a/app/urls.py b/app/urls.py index 7207a7f..99316a5 100644 --- a/app/urls.py +++ b/app/urls.py @@ -32,7 +32,9 @@ urlpatterns = [ path('register/', user_views.register, name='register'), path('comment/publish/', item_views.publish_comment, name='publish-comment'), path('comment/', item_views.comment, name='comment'), + path('_--/', item_views.archive, name='archive'), path('_/', item_views.archive, name='archive'), + path('_//', item_views.archive, name='archive'), path('/', item_views.item, name='item'), path('/', page_views.page, name='page'), path('', item_views.index, name='index'),