Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 33 additions & 1 deletion application/analytics_project/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
'model_clone',
'selection_of_keywords_for_rpd',
'streams_app',
'mdeditor',
# 'cachalot',
# 'django_extensions',
# 'ckeditor',
Expand Down Expand Up @@ -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'

Expand Down Expand Up @@ -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"},},
Expand Down
4 changes: 2 additions & 2 deletions application/dataprocessing/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)


Expand Down
2 changes: 2 additions & 0 deletions application/dataprocessing/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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']

Expand Down
3 changes: 2 additions & 1 deletion application/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 1 addition & 3 deletions application/workprogramsapp/files_export/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +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 ValueError
raise Exception("send error", response)

return None, response.json()["error_code"], response.json()


Expand Down Expand Up @@ -218,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"]:
Expand Down Expand Up @@ -274,8 +276,6 @@ def post_module_to_isu(token, module, parent_id, block, ap_id):
module_dict["rules_id"] = rules_ids[module.selection_rule]
if module.selection_parametr:
module_dict["params"] = [int(el) for el in module.selection_parametr.split(", ")]
elif module.selection_rule == "any_quantity":
module_dict["params"] = None
else:
module_dict["params"] = []
module_dict["rpd_module_id"] = module.id
Expand Down
Empty file.
Empty file.
24 changes: 24 additions & 0 deletions application/workprogramsapp/news/admin_site.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from django.contrib.admin import AdminSite
from django.contrib import admin

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)
22 changes: 22 additions & 0 deletions application/workprogramsapp/news/models.py
Original file line number Diff line number Diff line change
@@ -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)
9 changes: 9 additions & 0 deletions application/workprogramsapp/news/serializers.py
Original file line number Diff line number Diff line change
@@ -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']
10 changes: 10 additions & 0 deletions application/workprogramsapp/news/urls.py
Original file line number Diff line number Diff line change
@@ -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/<int:pk>/', NewsArticleRetrieveView.as_view(), name='news-article-detail'),
path('news-admin/', news_article_admin_site.urls)
]
22 changes: 22 additions & 0 deletions application/workprogramsapp/news/view.py
Original file line number Diff line number Diff line change
@@ -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]
8 changes: 8 additions & 0 deletions application/workprogramsapp/urls.py
Original file line number Diff line number Diff line change
@@ -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, \
Expand Down Expand Up @@ -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)
35 changes: 14 additions & 21 deletions application/workprogramsapp/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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):
Expand Down