wbnews 1.58.3__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. wbnews/.coveragerc +23 -0
  2. wbnews/__init__.py +1 -0
  3. wbnews/admin.py +30 -0
  4. wbnews/apps.py +9 -0
  5. wbnews/factories.py +36 -0
  6. wbnews/filters/__init__.py +1 -0
  7. wbnews/filters/news.py +46 -0
  8. wbnews/fixtures/wbnews.yaml +1 -0
  9. wbnews/import_export/__init__.py +0 -0
  10. wbnews/import_export/backends/__init__.py +1 -0
  11. wbnews/import_export/backends/news.py +36 -0
  12. wbnews/import_export/handlers/__init__.py +1 -0
  13. wbnews/import_export/handlers/news.py +57 -0
  14. wbnews/import_export/parsers/__init__.py +0 -0
  15. wbnews/import_export/parsers/emails/__init__.py +0 -0
  16. wbnews/import_export/parsers/emails/news.py +39 -0
  17. wbnews/import_export/parsers/emails/utils.py +65 -0
  18. wbnews/import_export/parsers/rss/__init__.py +0 -0
  19. wbnews/import_export/parsers/rss/news.py +58 -0
  20. wbnews/locale/de/LC_MESSAGES/django.mo +0 -0
  21. wbnews/locale/de/LC_MESSAGES/django.po +166 -0
  22. wbnews/locale/de/LC_MESSAGES/django.po.translated +173 -0
  23. wbnews/locale/en/LC_MESSAGES/django.mo +0 -0
  24. wbnews/locale/en/LC_MESSAGES/django.po +159 -0
  25. wbnews/locale/fr/LC_MESSAGES/django.mo +0 -0
  26. wbnews/locale/fr/LC_MESSAGES/django.po +162 -0
  27. wbnews/migrations/0001_initial_squashed_0005_alter_news_import_source.py +349 -0
  28. wbnews/migrations/0006_alter_news_language.py +122 -0
  29. wbnews/migrations/0007_auto_20240103_0955.py +43 -0
  30. wbnews/migrations/0008_alter_news_language.py +123 -0
  31. wbnews/migrations/0009_newsrelationship_analysis_newsrelationship_sentiment.py +94 -0
  32. wbnews/migrations/0010_newsrelationship_important.py +17 -0
  33. wbnews/migrations/0011_newsrelationship_content_object_repr.py +18 -0
  34. wbnews/migrations/0012_alter_news_unique_together_news_identifier_and_more.py +91 -0
  35. wbnews/migrations/0013_alter_news_datetime.py +19 -0
  36. wbnews/migrations/0014_newsrelationship_unique_news_relationship.py +27 -0
  37. wbnews/migrations/__init__.py +0 -0
  38. wbnews/models/__init__.py +3 -0
  39. wbnews/models/llm/cleaned_news.py +66 -0
  40. wbnews/models/news.py +131 -0
  41. wbnews/models/relationships.py +45 -0
  42. wbnews/models/sources.py +73 -0
  43. wbnews/models/utils.py +15 -0
  44. wbnews/serializers.py +134 -0
  45. wbnews/signals.py +4 -0
  46. wbnews/tasks.py +16 -0
  47. wbnews/tests/__init__.py +0 -0
  48. wbnews/tests/conftest.py +6 -0
  49. wbnews/tests/parsers/__init__.py +0 -0
  50. wbnews/tests/parsers/test_emails.py +25 -0
  51. wbnews/tests/test_models.py +80 -0
  52. wbnews/tests/test_utils.py +7 -0
  53. wbnews/tests/tests.py +12 -0
  54. wbnews/urls.py +25 -0
  55. wbnews/utils.py +57 -0
  56. wbnews/viewsets/__init__.py +12 -0
  57. wbnews/viewsets/buttons.py +42 -0
  58. wbnews/viewsets/display.py +148 -0
  59. wbnews/viewsets/endpoints.py +34 -0
  60. wbnews/viewsets/menu.py +29 -0
  61. wbnews/viewsets/titles.py +44 -0
  62. wbnews/viewsets/views.py +168 -0
  63. wbnews-1.58.3.dist-info/METADATA +7 -0
  64. wbnews-1.58.3.dist-info/RECORD +65 -0
  65. wbnews-1.58.3.dist-info/WHEEL +5 -0
wbnews/.coveragerc ADDED
@@ -0,0 +1,23 @@
1
+ [report]
2
+ exclude_lines =
3
+ print()
4
+ def api_endpoints_root
5
+ def get_or_create_model_sql
6
+ def profile_check
7
+ if hasattr
8
+ raise Exception
9
+ raise Http404
10
+ except:
11
+
12
+
13
+ [run]
14
+ omit = */migrations/*
15
+ manage.py
16
+ */tests/*
17
+ */wbnews_config/*
18
+ */apps.py
19
+ */docs/*
20
+ */dynamic_preferences_registry.py
21
+ */permissions.py
22
+ */preferences/*
23
+ */.venv/*
wbnews/__init__.py ADDED
@@ -0,0 +1 @@
1
+ __version__ = "1.0.0"
wbnews/admin.py ADDED
@@ -0,0 +1,30 @@
1
+ from django.contrib import admin
2
+
3
+ from .models import News, NewsRelationship, NewsSource
4
+
5
+
6
+ @admin.register(NewsRelationship)
7
+ class NewsRelationshipAdmin(admin.ModelAdmin):
8
+ list_display = ["news", "content_object"]
9
+ autocomplete_fields = ["news"]
10
+
11
+
12
+ @admin.register(News)
13
+ class NewsAdmin(admin.ModelAdmin):
14
+ search_fields = ("title", "description")
15
+ raw_id_fields = ["import_source"]
16
+ autocomplete_fields = [
17
+ "source",
18
+ ]
19
+ list_display = ["title", "language", "tags", "source", "datetime"]
20
+
21
+ list_filter = ("source",)
22
+
23
+ def get_queryset(self, request):
24
+ return News.all_objects.select_related("source")
25
+
26
+
27
+ @admin.register(NewsSource)
28
+ class NewsSourceAdmin(admin.ModelAdmin):
29
+ search_fields = ("type", "title", "identifier", "description", "author", "endpoint")
30
+ list_filter = ("type",)
wbnews/apps.py ADDED
@@ -0,0 +1,9 @@
1
+ from django.apps import AppConfig
2
+ from django.utils.module_loading import autodiscover_modules
3
+
4
+
5
+ class NewConfig(AppConfig):
6
+ name = "wbnews"
7
+
8
+ def ready(self) -> None:
9
+ autodiscover_modules("news")
wbnews/factories.py ADDED
@@ -0,0 +1,36 @@
1
+ import factory
2
+ from django.conf.global_settings import LANGUAGES
3
+ from django.utils import timezone
4
+ from faker import Factory
5
+
6
+ from wbnews.models import News, NewsSource
7
+
8
+ langs = [n for (n, v) in LANGUAGES]
9
+ faker = Factory.create()
10
+
11
+
12
+ class NewsSourceFactory(factory.django.DjangoModelFactory):
13
+ title = factory.Sequence(lambda n: f"source_{n}")
14
+ identifier = factory.Sequence(lambda n: f"http://myurl_{n}.com")
15
+ image = factory.Faker("url")
16
+ description = factory.Faker("sentence", nb_words=32)
17
+ author = factory.Faker("name")
18
+ endpoint = factory.Faker("url")
19
+
20
+ class Meta:
21
+ model = NewsSource
22
+
23
+
24
+ class NewsFactory(factory.django.DjangoModelFactory):
25
+ datetime = factory.LazyFunction(timezone.now)
26
+ title = factory.Faker("sentence", nb_words=32)
27
+ description = factory.Faker("sentence", nb_words=32)
28
+ summary = factory.Faker("sentence", nb_words=32)
29
+ language = factory.Iterator(langs)
30
+ link = factory.Faker("url")
31
+ guid = factory.LazyAttribute(lambda o: News.get_default_guid(o.title, o.link))
32
+ source = factory.SubFactory(NewsSourceFactory)
33
+
34
+ class Meta:
35
+ model = News
36
+ django_get_or_create = ("guid",)
@@ -0,0 +1 @@
1
+ from .news import NewsFilterSet, NewsRelationshipFilterSet
wbnews/filters/news.py ADDED
@@ -0,0 +1,46 @@
1
+ from wbcore import filters as wb_filters
2
+
3
+ from wbnews.models import News, NewsRelationship, NewsSource
4
+
5
+
6
+ class NewsFilterSet(wb_filters.FilterSet):
7
+ datetime = wb_filters.DateTimeRangeFilter()
8
+
9
+ class Meta:
10
+ model = News
11
+ fields = {"title": ["icontains"], "source": ["exact"], "language": ["exact"]}
12
+
13
+
14
+ class NewsRelationshipFilterSet(wb_filters.FilterSet):
15
+ datetime = wb_filters.DateTimeRangeFilter(method="filter_datetime")
16
+ title = wb_filters.CharFilter(lookup_expr="icontains")
17
+ description = wb_filters.CharFilter(lookup_expr="icontains")
18
+ summary = wb_filters.CharFilter(lookup_expr="icontains")
19
+ source = wb_filters.ModelMultipleChoiceFilter(
20
+ label="Source",
21
+ queryset=NewsSource.objects.all(),
22
+ endpoint=NewsSource.get_representation_endpoint(),
23
+ value_key=NewsSource.get_representation_value_key(),
24
+ label_key=NewsSource.get_representation_label_key(),
25
+ method="filter_source",
26
+ )
27
+ content_type = wb_filters.CharFilter(method="fake_filter", hidden=True)
28
+ object_id = wb_filters.CharFilter(method="fake_filter", hidden=True)
29
+
30
+ def filter_datetime(self, queryset, name, value):
31
+ if value:
32
+ return queryset.filter(news__datetime__gte=value.lower, news__datetime__lte=value.upper)
33
+ return queryset
34
+
35
+ def filter_source(self, queryset, name, value):
36
+ if value:
37
+ return queryset.filter(news__source__in=value)
38
+ return queryset
39
+
40
+ class Meta:
41
+ model = NewsRelationship
42
+ fields = {
43
+ "analysis": ["icontains"],
44
+ "sentiment": ["exact"],
45
+ "important": ["exact"],
46
+ }