Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • AlekSIS/official/AlekSIS-App-DashboardFeeds
  • sunweaver/AlekSIS-App-DashboardFeeds
2 results
Show changes
Commits on Source (3)
from django.contrib import admin
from .models import DashboardWidget, RSSFeedWidget, ICalFeedWidget
from .models import DashboardWidget, ICalFeedWidget, RSSFeedWidget
admin.site.register(DashboardWidget)
admin.site.register(RSSFeedWidget)
......
......@@ -3,7 +3,9 @@ from aleksis.core.util.apps import AppConfig
class DefaultConfig(AppConfig):
name = "aleksis.apps.dashboardfeeds"
verbose_name = "AlekSIS — Dashboard Feeds (Feeds from external resources as dashboard widgets)"
verbose_name = (
"AlekSIS — Dashboard Feeds (Feeds from external resources as dashboard widgets)"
)
urls = {
"Repository": "https://edugit.org/AlekSIS/official/AlekSIS-App-DashboardFeeds/",
......
# Generated by Django 3.0.2 on 2020-01-29 16:57
from django.db import migrations, models
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
......@@ -9,21 +9,37 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
('core', '0009_dashboard_widget'),
("core", "0009_dashboard_widget"),
]
operations = [
migrations.CreateModel(
name='RSSFeedWidget',
name="RSSFeedWidget",
fields=[
('dashboardwidget_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.DashboardWidget')),
('url', models.URLField(verbose_name='RSS Url')),
('base_url', models.URLField(help_text='index url of the news website (as link for users)', verbose_name='Base URL')),
(
"dashboardwidget_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="core.DashboardWidget",
),
),
("url", models.URLField(verbose_name="RSS Url")),
(
"base_url",
models.URLField(
help_text="index url of the news website (as link for users)",
verbose_name="Base URL",
),
),
],
options={
'verbose_name': 'RSS Widget',
'verbose_name_plural': 'RSS Widgets',
"verbose_name": "RSS Widget",
"verbose_name_plural": "RSS Widgets",
},
bases=('core.dashboardwidget',),
bases=("core.dashboardwidget",),
),
]
# Generated by Django 3.0.3 on 2020-03-13 15:42
from django.db import migrations, models
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('dashboardfeeds', '0001_initial'),
("dashboardfeeds", "0001_initial"),
]
operations = [
migrations.CreateModel(
name='ICalFeedWidget',
name="ICalFeedWidget",
fields=[
('dashboardwidget_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.DashboardWidget')),
('url', models.URLField(verbose_name='iCal URL')),
('base_url', models.URLField(help_text='index url of the calendar (as link for users)', verbose_name='Base URL')),
('events_count', models.IntegerField(default=5, verbose_name='number of displayed events')),
(
"dashboardwidget_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="core.DashboardWidget",
),
),
("url", models.URLField(verbose_name="iCal URL")),
(
"base_url",
models.URLField(
help_text="index url of the calendar (as link for users)",
verbose_name="Base URL",
),
),
(
"events_count",
models.IntegerField(
default=5, verbose_name="number of displayed events"
),
),
],
options={
'verbose_name': 'Ical Widget',
'verbose_name_plural': 'Ical Widgets',
"verbose_name": "Ical Widget",
"verbose_name_plural": "Ical Widgets",
},
bases=('core.dashboardwidget',),
bases=("core.dashboardwidget",),
),
]
# Generated by Django 3.0.4 on 2020-03-18 12:12
from django.db import migrations, models
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('feeds', '0006_auto_20190901_1644'),
('dashboardfeeds', '0002_icalfeedwidget'),
("feeds", "0006_auto_20190901_1644"),
("dashboardfeeds", "0002_icalfeedwidget"),
]
operations = [
migrations.AddField(
model_name='rssfeedwidget',
name='rss_source',
field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='feeds.Source', verbose_name='Rss Source'),
model_name="rssfeedwidget",
name="rss_source",
field=models.ForeignKey(
editable=False,
null=True,
on_delete=django.db.models.deletion.CASCADE,
to="feeds.Source",
verbose_name="Rss Source",
),
),
]
......@@ -6,13 +6,13 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('dashboardfeeds', '0003_rssfeedwidget_rss_source'),
("dashboardfeeds", "0003_rssfeedwidget_rss_source"),
]
operations = [
migrations.AddField(
model_name='rssfeedwidget',
name='text_only',
field=models.BooleanField(default=False, verbose_name='Text Only RSS Feed'),
model_name="rssfeedwidget",
name="text_only",
field=models.BooleanField(default=False, verbose_name="Text Only RSS Feed"),
),
]
import datetime
from typing import Optional
from django.db import models
from django.utils.translation import gettext_lazy as _
......@@ -15,12 +14,21 @@ class RSSFeedWidget(DashboardWidget):
template = "dashboardfeeds/rss.html"
url = models.URLField(verbose_name=_("RSS feed source URL"))
base_url = models.URLField(verbose_name=_("Base URL of related website"),
help_text=_("The widget will have a link to visit a related website to read more news"))
text_only = models.BooleanField(verbose_name=_("Text only"), help_text=_("Do not show an image to depict the news item"), default=False)
rss_source = models.ForeignKey(Source, on_delete=models.CASCADE, editable=False,
null=True)
base_url = models.URLField(
verbose_name=_("Base URL of related website"),
help_text=_(
"The widget will have a link to visit a related website to read more news"
),
)
text_only = models.BooleanField(
verbose_name=_("Text only"),
help_text=_("Do not show an image to depict the news item"),
default=False,
)
rss_source = models.ForeignKey(
Source, on_delete=models.CASCADE, editable=False, null=True
)
def save(self, *args, **kwargs):
# Update the linked RSS source object to transfer data into django-feeds
......@@ -64,9 +72,15 @@ class ICalFeedWidget(DashboardWidget):
template = "dashboardfeeds/ical.html"
url = models.URLField(verbose_name=_("iCalendar URL"))
base_url = models.URLField(verbose_name=_("Base URL of related calendar"),
help_text=_("The widget will have a link to visit a related website to see more events"))
events_count = models.IntegerField(verbose_name=_("Number of displayed events"), default=5)
base_url = models.URLField(
verbose_name=_("Base URL of related calendar"),
help_text=_(
"The widget will have a link to visit a related website to see more events"
),
)
events_count = models.IntegerField(
verbose_name=_("Number of displayed events"), default=5
)
def get_context(self):
feed = {
......
INSTALLED_APPS = [
'feeds',
"feeds",
]
......@@ -5,6 +5,6 @@ from aleksis.core.util.core_helpers import celery_optional
@celery_optional
def get_feeds():
""" Update RSS feeds through django-feeds """
"""Update RSS feeds through django-feeds."""
return update_feeds(max_feeds=10)
import logging
import re
from django.utils import timezone, formats
from django.core.cache import cache
from django.utils import formats, timezone
from ics import Calendar
from cache_memoize import cache_memoize
import requests
from cache_memoize import cache_memoize
from ics import Calendar
logger = logging.getLogger(__name__)
def get_current_events(calendar: Calendar, limit: int = 5) -> list:
""" Get upcoming events from a calendar (ICS) object
"""Get upcoming events from a calendar (ICS) object.
:param calendar: The calendar object
:param limit: Count of events
......@@ -52,22 +50,28 @@ def get_current_events(calendar: Calendar, limit: int = 5) -> list:
formatted = f"{begin_date_formatted}{end_date_formatted}"
else:
# Event has begin and end times
formatted = f"{begin_date_formatted} {begin_time_formatted}{end_date_formatted} {end_time_formatted}"
events.append({
"name": event.name,
"begin_timestamp": event.begin.timestamp,
"end_timestamp": event.end.timestamp,
"date_formatted": formatted,
})
formatted = f(
"{begin_date_formatted} {begin_time_formatted} –"
"{end_date_formatted} {end_time_formatted}"
)
events.append(
{
"name": event.name,
"begin_timestamp": event.begin.timestamp,
"end_timestamp": event.end.timestamp,
"date_formatted": formatted,
}
)
return events
@cache_memoize(300)
def get_current_events_with_cal(calendar_url: str, limit: int = 5) -> list:
""" Download an iCalendar file from an URL, parse using the ICS library
and return a limited number of events
"""
Download an iCalendar file from an URL, parse using the ICS library
and return a limited number of events.
"""
try:
......
This diff is collapsed.