Compare commits

...

2 commits

Author SHA1 Message Date
j
92f21cc859 notify telegram of new comments 2023-08-31 17:12:34 +01:00
j
dd2ce36765 archive per week 2023-08-31 17:05:27 +01:00
6 changed files with 107 additions and 6 deletions

View file

@ -83,6 +83,16 @@ class Item(models.Model):
) )
return week, archive 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): def get_absolute_url(self):
return reverse('item', kwargs={'id': self.id}) return reverse('item', kwargs={'id': self.id})

View file

@ -52,6 +52,15 @@ def announce_items():
os.unlink(f.name) 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) @app.task(queue="default", ignore_results=True)
def notify_moderators(id, link): def notify_moderators(id, link):
comment = models.Comment.objects.filter(id=id).first() comment = models.Comment.objects.filter(id=id).first()
@ -69,6 +78,10 @@ def notify_moderators(id, link):
rpc.send_reaction( rpc.send_reaction(
account, comment.data["moderator_ts"], "🎉", group=group account, comment.data["moderator_ts"], "🎉", group=group
) )
msg = '%s commented on <b>%s</b> at <a href="%s">%s</a>' % (
comment.name, comment.item.title, link, link
)
notify_telegram.delay(msg)
else: else:
print("failed to notify", r) print("failed to notify", r)

View file

@ -4,7 +4,7 @@ import json
from django.utils import timezone from django.utils import timezone
from django.utils.timezone import datetime, timedelta 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.db.models import Q
from django.utils.html import mark_safe from django.utils.html import mark_safe
from django.conf import settings from django.conf import settings
@ -23,6 +23,31 @@ def get_now():
return timezone.make_aware(datetime.now(), timezone.get_default_timezone()) 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): def index(request):
context = default_context(request) context = default_context(request)
now = request.GET.get("now") now = request.GET.get("now")
@ -36,7 +61,7 @@ def index(request):
week, archive = models.Item.public(now) week, archive = models.Item.public(now)
context['items'] = week context['items'] = week
if archive.exists(): if archive.exists():
context['archive'] = '/_%s/' % get_now().year context['archive'] = '/_%s/' % get_monday(get_now() - timedelta(days=7))
if now: if now:
context['now'] = now context['now'] = now
context['previous_week'] = (now - timedelta(days=7)).strftime(TS_FORMAT) context['previous_week'] = (now - timedelta(days=7)).strftime(TS_FORMAT)
@ -44,11 +69,26 @@ def index(request):
return render(request, 'index.html', context) 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) context = default_context(request)
qs = models.Item.public() _, archive = models.Item.public()
week, archive = models.Item.public() if year and month and day:
context['items'] = archive 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) return render(request, 'archive.html', context)
@ -131,6 +171,11 @@ def publish_comment(request):
send_reaction( send_reaction(
account, comment.data["moderator_ts"], "🎉", group=group account, comment.data["moderator_ts"], "🎉", group=group
) )
link = request.build_absolute_uri(comment.item.get_absolute_url())
msg = '%s commented on <b>%s</b> at <a href="%s">%s</a>' % (
comment.name, comment.item.title, link, link
)
tasks.notify_telegram.delay(msg)
response['status'] = 'ok' response['status'] = 'ok'
else: else:
response['error'] = 'permission denied' response['error'] = 'permission denied'

View file

@ -134,6 +134,10 @@ header {
} }
} }
} }
.weeks {
text-align: center;
padding-bottom: 32px;
}
nav.overlay { nav.overlay {
position: absolute; position: absolute;

View file

@ -18,5 +18,32 @@
</div> </div>
{% endif %} {% endif %}
</div> </div>
{% if weeks %}
<div class="weeks">
<div>
{% for week in weeks %}
{% ifchanged week.year %}
</div>
<h1>{{ week.year }}</h1>
<div class="year-details-{{ week.year }}" {% if week.year != this_year %} style="display: none"{% endif %}>
{% endifchanged %}
{% if week.date == this_week %}
<b>{{ week.title }}</b><br>
{% else %}
<a href="/_{{ week.date }}/">{{ week.title }}</a><br>
{% endif %}
{% endfor %}
</div>
<script>
document.querySelectorAll('.weeks h1').forEach(h1 => {
h1.addEventListener('click', event => {
var year = event.target.innerText
var details = document.querySelector('.year-details-' + year)
details.style.display = details.style.display == 'none' ? '' : 'none'
})
})
</script>
</div>
{% endif %}
{% endblock %} {% endblock %}

View file

@ -32,7 +32,9 @@ urlpatterns = [
path('register/', user_views.register, name='register'), path('register/', user_views.register, name='register'),
path('comment/publish/', item_views.publish_comment, name='publish-comment'), path('comment/publish/', item_views.publish_comment, name='publish-comment'),
path('comment/', item_views.comment, name='comment'), path('comment/', item_views.comment, name='comment'),
path('_<int:year>-<int:month>-<int:day>/', item_views.archive, name='archive'),
path('_<int:year>/', item_views.archive, name='archive'), path('_<int:year>/', item_views.archive, name='archive'),
path('_<int:year>/<int:week>/', item_views.archive, name='archive'),
path('<int:id>/', item_views.item, name='item'), path('<int:id>/', item_views.item, name='item'),
path('<str:slug>/', page_views.page, name='page'), path('<str:slug>/', page_views.page, name='page'),
path('', item_views.index, name='index'), path('', item_views.index, name='index'),