From c3bc609f6c73c5938a3217fede0c6ef2e858a28a Mon Sep 17 00:00:00 2001 From: rendex Date: Fri, 9 Feb 2024 11:13:45 +0300 Subject: [PATCH 1/8] throw exception when send --- .../workprogramsapp/isu_merge/post_to_isu/updaters_isu_logic.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/application/workprogramsapp/isu_merge/post_to_isu/updaters_isu_logic.py b/application/workprogramsapp/isu_merge/post_to_isu/updaters_isu_logic.py index 88985c757..39937343b 100644 --- a/application/workprogramsapp/isu_merge/post_to_isu/updaters_isu_logic.py +++ b/application/workprogramsapp/isu_merge/post_to_isu/updaters_isu_logic.py @@ -38,6 +38,8 @@ def generate_response(url, headers, body, obj_name, obj_id, ap_id=None): except: return None, response.json()["error_code"], response.json() else: + raise Exception("send error", response) + return None, response.json()["error_code"], response.json() From 4dc45d7827440a257d07f208987fbcab56d2ac13 Mon Sep 17 00:00:00 2001 From: rendex Date: Wed, 22 May 2024 14:53:53 +0300 Subject: [PATCH 2/8] correct download wp --- application/workprogramsapp/files_export/views.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/application/workprogramsapp/files_export/views.py b/application/workprogramsapp/files_export/views.py index d3b6f32e6..21892c1fe 100644 --- a/application/workprogramsapp/files_export/views.py +++ b/application/workprogramsapp/files_export/views.py @@ -159,7 +159,7 @@ def render_context(context, **kwargs): if ev_tool not in evaluation_tools: evaluation_tools.append(ev_tool) for j in i['topics']: - topics_list.append(j['description']) + topics_list.append(j['description'].replace("<", "").replace(">", "")) if j['url_online_course'] is None: pass else: @@ -364,8 +364,6 @@ def render_context(context, **kwargs): template_context['extra_points'] = context['extra_points'] template_context['discipline_section'] = context['discipline_sections'] template_context['bars'] = context["bars"] - print('bib', template_context['bibliographic_reference']) - print(semester) return template_context, filename # , evaluation_tools_pdf_docs From cd2fc5c6b3863860c4ed52c51634e607bd455bb1 Mon Sep 17 00:00:00 2001 From: rendex Date: Wed, 29 May 2024 16:21:47 +0300 Subject: [PATCH 3/8] outcomes and prerequisites edit fixed --- application/workprogramsapp/views.py | 35 +++++++++++----------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/application/workprogramsapp/views.py b/application/workprogramsapp/views.py index 210f14265..5e23cc7e9 100644 --- a/application/workprogramsapp/views.py +++ b/application/workprogramsapp/views.py @@ -505,19 +505,15 @@ class OutcomesOfWorkProgramDestroyView(generics.DestroyAPIView): permission_classes = [IsRpdDeveloperOrReadOnly] def delete(self, request, *args, **kwargs): - try: - obj = OutcomesOfWorkProgram.objects.get(pk=kwargs['pk']) - - # изменяем значение value для item - item = Items.objects.get(name=obj.item) - value = item.value - item.value = int(value) - 1 - item.save() + obj = OutcomesOfWorkProgram.objects.get(pk=kwargs['pk']) - return self.destroy(request, *args, **kwargs) - except: - return self.destroy(request, *args, **kwargs) + # изменяем значение value для item + item = obj.item + value = item.value + item.value = int(value) - 1 + item.save() + return self.destroy(request, *args, **kwargs) class OutcomesOfWorkProgramUpdateView(generics.UpdateAPIView): queryset = OutcomesOfWorkProgram.objects.all() @@ -627,18 +623,15 @@ class PrerequisitesOfWorkProgramDestroyView(generics.DestroyAPIView): permission_classes = [IsRpdDeveloperOrReadOnly] def delete(self, request, *args, **kwargs): - try: - obj = PrerequisitesOfWorkProgram.objects.get(pk=kwargs['pk']) + obj = PrerequisitesOfWorkProgram.objects.get(pk=kwargs['pk']) - # изменяем значение value для item - item = Items.objects.get(name=obj.item) - value = item.value - item.value = int(value) - 1 - item.save() + # изменяем значение value для item + item = obj.item + value = item.value + item.value = int(value) - 1 + item.save() - return self.destroy(request, *args, **kwargs) - except: - return Response(status=400) + return self.destroy(request, *args, **kwargs) class PrerequisitesOfWorkProgramUpdateView(generics.UpdateAPIView): From 7187e65818b6e388095f89e4f2e747ec2ecf7cbd Mon Sep 17 00:00:00 2001 From: rendex Date: Mon, 10 Jun 2024 12:46:34 +0300 Subject: [PATCH 4/8] faculty block returns --- application/workprogramsapp/ap_improvment/competence_matrix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/workprogramsapp/ap_improvment/competence_matrix.py b/application/workprogramsapp/ap_improvment/competence_matrix.py index b65c80d7f..25d1b3ffe 100644 --- a/application/workprogramsapp/ap_improvment/competence_matrix.py +++ b/application/workprogramsapp/ap_improvment/competence_matrix.py @@ -116,7 +116,7 @@ def GetCompetenceMatrixCTE(request, gen_pk): "discipline_blocks_in_academic_plan": []} matrix_list.append(academic_plan_matrix_dict) for block in academic_plan.discipline_blocks_in_academic_plan.all(): - if not ("1" in block.name or "2" in block.name): + if "3" in block.name: continue block_dict = {"name": block.name, "modules_in_discipline_block": []} cte = With(None, "module_cte", False) From e14eb2087628f4c9f66c2a4de177ec425fc50b1d Mon Sep 17 00:00:00 2001 From: rendex Date: Thu, 13 Jun 2024 17:36:14 +0300 Subject: [PATCH 5/8] md editing for project news --- application/analytics_project/settings.py | 34 ++++++++++++++++++- application/dataprocessing/admin.py | 4 +-- application/dataprocessing/models.py | 2 ++ application/requirements.txt | 1 + application/workprogramsapp/news/__init__.py | 0 application/workprogramsapp/news/admin.py | 7 ++++ .../workprogramsapp/news/admin_site.py | 26 ++++++++++++++ application/workprogramsapp/news/models.py | 22 ++++++++++++ .../workprogramsapp/news/serializers.py | 9 +++++ application/workprogramsapp/news/urls.py | 10 ++++++ application/workprogramsapp/news/view.py | 22 ++++++++++++ application/workprogramsapp/urls.py | 8 +++++ 12 files changed, 142 insertions(+), 3 deletions(-) create mode 100644 application/workprogramsapp/news/__init__.py create mode 100644 application/workprogramsapp/news/admin.py create mode 100644 application/workprogramsapp/news/admin_site.py create mode 100644 application/workprogramsapp/news/models.py create mode 100644 application/workprogramsapp/news/serializers.py create mode 100644 application/workprogramsapp/news/urls.py create mode 100644 application/workprogramsapp/news/view.py diff --git a/application/analytics_project/settings.py b/application/analytics_project/settings.py index 090564c04..9ae0672bf 100644 --- a/application/analytics_project/settings.py +++ b/application/analytics_project/settings.py @@ -69,6 +69,7 @@ 'selection_of_keywords_for_rpd', 'streams_app', 'cachalot', + 'mdeditor', # 'django_extensions', # 'ckeditor', # 'ckeditor_uploader', @@ -167,8 +168,9 @@ STATIC_URL = '/static-backend/' STATIC_ROOT = os.path.join(BASE_DIR, 'static-backend') -MEDIA_URL = '/media/' + MEDIA_ROOT = os.path.join(BASE_DIR, 'media') +MEDIA_URL = '/media/' AUTH_USER_MODEL = 'dataprocessing.User' @@ -383,6 +385,36 @@ }, } +MDEDITOR_CONFIGS = { + 'default': { + 'width': '90% ', # Custom edit box width + 'height': 500, # Custom edit box height + 'toolbar': ["undo", "redo", "|", + "bold", "del", "italic", "quote", "ucwords", "uppercase", "lowercase", "|", + "h1", "h2", "h3", "h5", "h6", "|", + "list-ul", "list-ol", "hr", "|", + "link", "reference-link", "image", "code", "preformatted-text", "code-block", "table", "datetime", + "emoji", "html-entities", "pagebreak", "goto-line", "|", + "help", "info", + "||", "preview", "watch", "fullscreen"], # custom edit box toolbar + 'upload_image_formats': ["jpg", "jpeg", "gif", "png", "bmp", "webp"], # image upload format type + 'image_folder': 'editor', # image save the folder name + 'theme': 'default', # edit box theme, dark / default + 'preview_theme': 'default', # Preview area theme, dark / default + 'editor_theme': 'default', # edit area theme, pastel-on-dark / default + 'toolbar_autofixed': True, # Whether the toolbar capitals + 'search_replace': True, # Whether to open the search for replacement + 'emoji': True, # whether to open the expression function + 'tex': True, # whether to open the tex chart function + 'flow_chart': True, # whether to open the flow chart function + 'sequence': True, # Whether to open the sequence diagram function + 'watch': True, # Live preview + 'lineWrapping': False, # lineWrapping + 'lineNumbers': False, # lineNumbers + 'language': 'en' # zh / en / es + } + +} """LOGGING = {'version': 1, "handlers":{"console": {"class": "logging.StreamHandler"},}, diff --git a/application/dataprocessing/admin.py b/application/dataprocessing/admin.py index 20cc86681..05c8fc0c2 100644 --- a/application/dataprocessing/admin.py +++ b/application/dataprocessing/admin.py @@ -6,8 +6,8 @@ from .models import User UserAdmin.fieldsets += ('Custom fields set', {'fields': ( -'isu_number', 'is_rpd_developer', 'is_expertise_master', 'expertise_status_notification', -'expertise_comments_notification')}), + 'isu_number', 'is_rpd_developer', 'is_expertise_master', 'expertise_status_notification', + 'expertise_comments_notification', 'unread_news', 'do_news_notification')}), admin.site.register(User, UserAdmin) diff --git a/application/dataprocessing/models.py b/application/dataprocessing/models.py index be7eeb54a..b528108cc 100644 --- a/application/dataprocessing/models.py +++ b/application/dataprocessing/models.py @@ -16,6 +16,8 @@ class User(AbstractUser): expertise_status_notification = models.BooleanField(default=False, blank=True, null=True) expertise_comments_notification = models.BooleanField(default=False, blank=True, null=True) structural_unit = models.ManyToManyField("workprogramsapp.StructuralUnit", through="workprogramsapp.UserStructuralUnit", blank=True, null=True ) + unread_news = models.IntegerField(default=0, blank=True, null=True, verbose_name='Непрочтенные новости') + do_news_notification = models.BooleanField(default=False, blank=True, null=True) REQUIRED_FIELDS = ['first_name', 'last_name', 'email'] diff --git a/application/requirements.txt b/application/requirements.txt index 5b15fa7d9..ab8022e0c 100644 --- a/application/requirements.txt +++ b/application/requirements.txt @@ -100,3 +100,4 @@ uritemplate==3.0.1 urllib3==1.25.6 wdc==0.4.12 xlrd==1.2.0 +django-mdeditor==0.1.20 diff --git a/application/workprogramsapp/news/__init__.py b/application/workprogramsapp/news/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/application/workprogramsapp/news/admin.py b/application/workprogramsapp/news/admin.py new file mode 100644 index 000000000..2581ea57c --- /dev/null +++ b/application/workprogramsapp/news/admin.py @@ -0,0 +1,7 @@ +from django.contrib import admin +from markdownx.admin import MarkdownxModelAdmin + +from workprogramsapp.news.models import NewsArticle + +#admin.site.register(NewsArticle) +#admin.site.register(NewsArticle, MarkdownxModelAdmin) \ No newline at end of file diff --git a/application/workprogramsapp/news/admin_site.py b/application/workprogramsapp/news/admin_site.py new file mode 100644 index 000000000..7e3db9939 --- /dev/null +++ b/application/workprogramsapp/news/admin_site.py @@ -0,0 +1,26 @@ +from django.contrib.admin import AdminSite +from django.contrib import admin +from django.db import models +from markdownx.widgets import AdminMarkdownxWidget + +from workprogramsapp.news.models import NewsArticle + + +class NewsArticleAdminSite(AdminSite): + site_header = "Администрирование новостей" + site_title = "NewsArticle Admin" + index_title = "Управление новостями" + + +news_article_admin_site = NewsArticleAdminSite(name='news_article_admin') + + +class NewsArticleAdmin(admin.ModelAdmin): + list_display = ('title', 'author', 'notify_all') + search_fields = ('title', 'text') + list_filter = ('notify_all',) + ordering = ('-id',) + """""" + + +news_article_admin_site.register(NewsArticle, NewsArticleAdmin) diff --git a/application/workprogramsapp/news/models.py b/application/workprogramsapp/news/models.py new file mode 100644 index 000000000..66ee59ca3 --- /dev/null +++ b/application/workprogramsapp/news/models.py @@ -0,0 +1,22 @@ +from django.db import models +from django.db.models import F +from mdeditor.fields import MDTextField +from dataprocessing.models import User + + +class NewsArticle(models.Model): + title = models.CharField(max_length=512, verbose_name="Наименование новости", blank=True, + null=True) + text = MDTextField(verbose_name="Текст новости", blank=True, + null=True) + preview_img = models.TextField(blank=True, null=True) + author = models.ForeignKey("dataprocessing.User", on_delete=models.SET_NULL, blank=True, null=True) + notify_all = models.BooleanField(default=False, blank=True, null=True) + + def save(self, force_insert=False, force_update=False, using=None, + update_fields=None, *args, **kwargs): + super(NewsArticle, self).save(force_insert, force_update, *args, **kwargs) + if self.notify_all: + User.objects.all().update(unread_news=F('unread_news') + 1) + else: + User.objects.filter(do_news_notification=True).update(unread_news=F('unread_news') + 1) diff --git a/application/workprogramsapp/news/serializers.py b/application/workprogramsapp/news/serializers.py new file mode 100644 index 000000000..92114aece --- /dev/null +++ b/application/workprogramsapp/news/serializers.py @@ -0,0 +1,9 @@ +from rest_framework import serializers + +from workprogramsapp.news.models import NewsArticle + + +class NewsArticleSerializer(serializers.ModelSerializer): + class Meta: + model = NewsArticle + fields = ['id', 'title', 'text', 'preview_img', 'author', 'notify_all'] \ No newline at end of file diff --git a/application/workprogramsapp/news/urls.py b/application/workprogramsapp/news/urls.py new file mode 100644 index 000000000..2fe7f1a23 --- /dev/null +++ b/application/workprogramsapp/news/urls.py @@ -0,0 +1,10 @@ +from django.urls import path + +from workprogramsapp.news.admin_site import news_article_admin_site +from workprogramsapp.news.view import NewsArticleRetrieveView, NewsArticleListView + +urlpatterns = [ + path('api/news-articles/', NewsArticleListView.as_view(), name='news-article-list-create'), + path('api/news-articles//', NewsArticleRetrieveView.as_view(), name='news-article-detail'), + path('news-admin/', news_article_admin_site.urls) +] \ No newline at end of file diff --git a/application/workprogramsapp/news/view.py b/application/workprogramsapp/news/view.py new file mode 100644 index 000000000..5f028cda4 --- /dev/null +++ b/application/workprogramsapp/news/view.py @@ -0,0 +1,22 @@ +from rest_framework import generics +from rest_framework.permissions import IsAuthenticated + +from workprogramsapp.news.models import NewsArticle +from workprogramsapp.news.serializers import NewsArticleSerializer + + +class NewsArticleListView(generics.ListAPIView): + queryset = NewsArticle.objects.all() + serializer_class = NewsArticleSerializer + permission_classes = [IsAuthenticated] + + def get(self, request, *args, **kwargs): + request.user.unread_news = 0 + request.user.save() + return self.list(request, *args, **kwargs) + + +class NewsArticleRetrieveView(generics.RetrieveAPIView): + queryset = NewsArticle.objects.all() + serializer_class = NewsArticleSerializer + permission_classes = [IsAuthenticated] diff --git a/application/workprogramsapp/urls.py b/application/workprogramsapp/urls.py index b034f3372..fe5f012b8 100644 --- a/application/workprogramsapp/urls.py +++ b/application/workprogramsapp/urls.py @@ -1,7 +1,9 @@ from django.conf.urls import url, include +from django.conf.urls.static import static from django.urls import path from rest_framework.routers import DefaultRouter +from analytics_project import settings from .educational_program.views import DepartmentCreateAPIView, DepartmentListAPIView, DepartmentDetailsView, \ DepartmentDestroyView, DepartmentUpdateView, academic_plan_all_ids_by_year from .expertise.views import ExpertiseCommentCreateView, UserExpertiseCreateView, UserExpertiseListView, \ @@ -330,6 +332,12 @@ url(r'^', include('gia_practice_app.Practice.urls')), url(r'^', include('workprogramsapp.bibliographic_reference.urls')), url(r'^', include('workprogramsapp.disciplineblockmodules.urls')), + url(r'^', include('workprogramsapp.news.urls')), + url(r'mdeditor/', include('mdeditor.urls')) + ] +if settings.DEBUG: + # static files (images, css, javascript, etc.) + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) From f1566717aacce1f8671fc38676b4efd6702f4e81 Mon Sep 17 00:00:00 2001 From: rendex Date: Thu, 13 Jun 2024 18:57:07 +0300 Subject: [PATCH 6/8] md editing for project news --- application/requirements.txt | 2 +- application/workprogramsapp/news/admin.py | 7 ------- application/workprogramsapp/news/admin_site.py | 2 -- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/application/requirements.txt b/application/requirements.txt index ab8022e0c..4aaf388fc 100644 --- a/application/requirements.txt +++ b/application/requirements.txt @@ -67,7 +67,7 @@ pandas==1.4.2 pdf2docx==0.5.2 pdfkit==0.6.1 Pillow==7.0.0 -psycopg2==2.8.4 +psycopg2~=2.8.6 pycparser==2.20 PyJWT==1.7.1 PyMuPDF==1.18.16 diff --git a/application/workprogramsapp/news/admin.py b/application/workprogramsapp/news/admin.py index 2581ea57c..e69de29bb 100644 --- a/application/workprogramsapp/news/admin.py +++ b/application/workprogramsapp/news/admin.py @@ -1,7 +0,0 @@ -from django.contrib import admin -from markdownx.admin import MarkdownxModelAdmin - -from workprogramsapp.news.models import NewsArticle - -#admin.site.register(NewsArticle) -#admin.site.register(NewsArticle, MarkdownxModelAdmin) \ No newline at end of file diff --git a/application/workprogramsapp/news/admin_site.py b/application/workprogramsapp/news/admin_site.py index 7e3db9939..a77ba4bfb 100644 --- a/application/workprogramsapp/news/admin_site.py +++ b/application/workprogramsapp/news/admin_site.py @@ -1,7 +1,5 @@ from django.contrib.admin import AdminSite from django.contrib import admin -from django.db import models -from markdownx.widgets import AdminMarkdownxWidget from workprogramsapp.news.models import NewsArticle From 6a1ff8707a4f857dbb9d4da5dcb4a9f740574fd7 Mon Sep 17 00:00:00 2001 From: rendex Date: Tue, 18 Jun 2024 17:51:23 +0300 Subject: [PATCH 7/8] fake_sro consulations fixing --- .../isu_merge/post_to_isu/updaters_isu_logic.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/application/workprogramsapp/isu_merge/post_to_isu/updaters_isu_logic.py b/application/workprogramsapp/isu_merge/post_to_isu/updaters_isu_logic.py index 39937343b..4b467e174 100644 --- a/application/workprogramsapp/isu_merge/post_to_isu/updaters_isu_logic.py +++ b/application/workprogramsapp/isu_merge/post_to_isu/updaters_isu_logic.py @@ -219,7 +219,8 @@ def post_wp_to_isu(token, wp, ap_id) -> tuple: order_dict["work_types"].append(generate_contents(order=order, volume=practice_list[order], type_id=3)) if sro_list[order] != 0: fake_sro = 36 * ze[order] - lecture_list[order] - lab_list[order] - practice_list[order] - cons_list[order] - order_dict["work_types"].append(generate_contents(order=order, volume=fake_sro, type_id=4)) + if fake_sro != 0: + order_dict["work_types"].append(generate_contents(order=order, volume=fake_sro, type_id=4)) if cons_list[order] != 0: order_dict["work_types"].append(generate_contents(order=order, volume=cons_list[order], type_id=12)) if order_dict["work_types"]: From eb958acdd9cbaf16df5b354d11f1fdefb64662e3 Mon Sep 17 00:00:00 2001 From: rendex Date: Tue, 18 Jun 2024 18:02:54 +0300 Subject: [PATCH 8/8] fake_sro consulations fixing --- .../isu_merge/post_to_isu/updaters_isu_logic.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/application/workprogramsapp/isu_merge/post_to_isu/updaters_isu_logic.py b/application/workprogramsapp/isu_merge/post_to_isu/updaters_isu_logic.py index 39937343b..cbd265d51 100644 --- a/application/workprogramsapp/isu_merge/post_to_isu/updaters_isu_logic.py +++ b/application/workprogramsapp/isu_merge/post_to_isu/updaters_isu_logic.py @@ -219,7 +219,8 @@ def post_wp_to_isu(token, wp, ap_id) -> tuple: order_dict["work_types"].append(generate_contents(order=order, volume=practice_list[order], type_id=3)) if sro_list[order] != 0: fake_sro = 36 * ze[order] - lecture_list[order] - lab_list[order] - practice_list[order] - cons_list[order] - order_dict["work_types"].append(generate_contents(order=order, volume=fake_sro, type_id=4)) + if fake_sro !=0: + order_dict["work_types"].append(generate_contents(order=order, volume=fake_sro, type_id=4)) if cons_list[order] != 0: order_dict["work_types"].append(generate_contents(order=order, volume=cons_list[order], type_id=12)) if order_dict["work_types"]: