diff --git a/cdeep/models.py b/cdeep/models.py index 011f3e7a2..d89fc0024 100644 --- a/cdeep/models.py +++ b/cdeep/models.py @@ -41,8 +41,8 @@ class Meta(object): class UsersRoles(models.Model): - uid = models.ForeignKey(Users, db_column='uid') - rid = models.ForeignKey(Role, db_column='rid') + uid = models.ForeignKey(Users, db_column='uid', on_delete=models.PROTECT) + rid = models.ForeignKey(Role, db_column='rid', on_delete=models.PROTECT) class Meta(object): db_table = 'users_roles' @@ -83,22 +83,22 @@ class Meta(object): class TutorialCommonContents(models.Model): id = models.IntegerField(primary_key=True) - tutorial_detail = models.ForeignKey(TutorialDetails) + tutorial_detail = models.ForeignKey(TutorialDetails, on_delete=models.PROTECT) tutorial_slide = models.TextField() - tutorial_slide_uid = models.ForeignKey(Users, related_name='slides', db_column='tutorial_slide_uid') + tutorial_slide_uid = models.ForeignKey(Users, related_name='slides', db_column='tutorial_slide_uid', on_delete=models.PROTECT) tutorial_slide_status = models.IntegerField() tutorial_code = models.TextField() - tutorial_code_uid = models.ForeignKey(Users, related_name='codes', db_column='tutorial_code_uid') + tutorial_code_uid = models.ForeignKey(Users, related_name='codes', db_column='tutorial_code_uid', on_delete=models.PROTECT) tutorial_code_status = models.IntegerField() tutorial_assignment = models.TextField() - tutorial_assignment_uid = models.ForeignKey(Users, related_name='assignments', db_column='tutorial_assignment_uid') + tutorial_assignment_uid = models.ForeignKey(Users, related_name='assignments', db_column='tutorial_assignment_uid', on_delete=models.PROTECT) tutorial_assignment_status = models.IntegerField() tutorial_prerequisit = models.IntegerField() tutorial_prerequisit_uid = models.ForeignKey( - Users, related_name='prerequisite', db_column='tutorial_prerequisit_uid') + Users, related_name='prerequisite', db_column='tutorial_prerequisit_uid', on_delete=models.PROTECT) tutorial_prerequisit_status = models.IntegerField() tutorial_keywords = models.TextField() - tutorial_keywords_uid = models.ForeignKey(Users, related_name='keywords', db_column='tutorial_keywords_uid') + tutorial_keywords_uid = models.ForeignKey(Users, related_name='keywords', db_column='tutorial_keywords_uid', on_delete=models.PROTECT) class Meta(object): db_table = 'tutorial_common_contents' @@ -107,21 +107,21 @@ class Meta(object): class TutorialResources(models.Model): id = models.IntegerField(primary_key=True) - tutorial_detail = models.ForeignKey(TutorialDetails) - uid = models.ForeignKey(Users, db_column='uid') + tutorial_detail = models.ForeignKey(TutorialDetails, on_delete=models.PROTECT) + uid = models.ForeignKey(Users, db_column='uid', on_delete=models.PROTECT) language = models.CharField(max_length=50) upload_time = models.DateTimeField() reviewer = models.CharField(max_length=400) - tutorial_content = models.ForeignKey(TutorialCommonContents) + tutorial_content = models.ForeignKey(TutorialCommonContents, on_delete=models.PROTECT) tutorial_outline = models.TextField() - tutorial_outline_uid = models.ForeignKey(Users, related_name='outlines', db_column='tutorial_outline_uid') + tutorial_outline_uid = models.ForeignKey(Users, related_name='outlines', db_column='tutorial_outline_uid', on_delete=models.PROTECT) tutorial_outline_status = models.IntegerField() tutorial_script = models.TextField() - tutorial_script_uid = models.ForeignKey(Users, related_name='scripts', db_column='tutorial_script_uid') + tutorial_script_uid = models.ForeignKey(Users, related_name='scripts', db_column='tutorial_script_uid', on_delete=models.PROTECT) tutorial_script_status = models.IntegerField() tutorial_script_timed = models.TextField() tutorial_video = models.TextField() - tutorial_video_uid = models.ForeignKey(Users, related_name='videos', db_column='tutorial_video_uid') + tutorial_video_uid = models.ForeignKey(Users, related_name='videos', db_column='tutorial_video_uid', on_delete=models.PROTECT) tutorial_video_status = models.IntegerField() tutorial_status = models.CharField(max_length=50) cvideo_version = models.IntegerField() @@ -135,8 +135,8 @@ class Meta(object): class TutorialDomainReviewerRoles(models.Model): id = models.IntegerField(primary_key=True) - uid = models.ForeignKey(Users, db_column='uid') - language = models.ForeignKey(TutorialLanguages) + uid = models.ForeignKey(Users, db_column='uid', on_delete=models.PROTECT) + language = models.ForeignKey(TutorialLanguages, on_delete=models.PROTECT) class Meta(object): db_table = 'tutorial_domain_reviewer_roles' @@ -145,8 +145,8 @@ class Meta(object): class TutorialQualityRoles(models.Model): id = models.IntegerField(primary_key=True) - uid = models.ForeignKey(Users, db_column='uid') - language = models.ForeignKey(TutorialLanguages) + uid = models.ForeignKey(Users, db_column='uid', on_delete=models.PROTECT) + language = models.ForeignKey(TutorialLanguages, on_delete=models.PROTECT) class Meta(object): db_table = 'tutorial_quality_roles' @@ -155,7 +155,7 @@ class Meta(object): class TutorialUpdateLog(models.Model): id = models.IntegerField(primary_key=True) - tutorial_resources = models.ForeignKey(TutorialResources) + tutorial_resources = models.ForeignKey(TutorialResources, on_delete=models.PROTECT) update_time = models.DateTimeField() updated_by = models.CharField(max_length=255) updated_content = models.CharField(max_length=255) @@ -167,8 +167,8 @@ class Meta(object): class CTutorialMissingComponent(models.Model): id = models.IntegerField(primary_key=True) - uid = models.ForeignKey(Users, db_column='uid') - trid = models.ForeignKey(TutorialResources, db_column='trid') + uid = models.ForeignKey(Users, db_column='uid', on_delete=models.PROTECT) + trid = models.ForeignKey(TutorialResources, db_column='trid', on_delete=models.PROTECT) component = models.CharField(max_length=15) type = models.IntegerField() remarks = models.TextField() @@ -186,7 +186,7 @@ class Meta(object): class CTutorialMissingComponentReply(models.Model): id = models.IntegerField(primary_key=True) missing_component_id = models.IntegerField() - uid = models.ForeignKey(Users, db_column='uid') + uid = models.ForeignKey(Users, db_column='uid', on_delete=models.PROTECT) reply_message = models.TextField() created = models.DateTimeField() @@ -197,8 +197,8 @@ class Meta(object): class TutorialPublicReview(models.Model): id = models.IntegerField(primary_key=True) - uid = models.ForeignKey(Users, db_column='uid') - trid = models.ForeignKey(TutorialResources, db_column='trid') + uid = models.ForeignKey(Users, db_column='uid', on_delete=models.PROTECT) + trid = models.ForeignKey(TutorialResources, db_column='trid', on_delete=models.PROTECT) date_time = models.DateTimeField() component = models.CharField(max_length=20) comment = models.TextField() @@ -210,7 +210,7 @@ class Meta(object): class TutorialPublicReviewVideo(models.Model): id = models.IntegerField(primary_key=True) - tutorial_public_review = models.ForeignKey(TutorialPublicReview) + tutorial_public_review = models.ForeignKey(TutorialPublicReview, on_delete=models.PROTECT) item = models.IntegerField() everywhere = models.IntegerField() video_time = models.TimeField() @@ -222,7 +222,7 @@ class Meta(object): class UserRatings(models.Model): id = models.IntegerField(primary_key=True) - uid = models.ForeignKey(Users, db_column='uid') + uid = models.ForeignKey(Users, db_column='uid', on_delete=models.PROTECT) page_id = models.IntegerField() rated_date = models.DateField() rating = models.BigIntegerField() @@ -234,8 +234,8 @@ class Meta(object): class VideoComments(models.Model): id = models.IntegerField(primary_key=True) - tutorial_resource = models.ForeignKey(TutorialResources) - uid = models.ForeignKey(Users, db_column='uid') + tutorial_resource = models.ForeignKey(TutorialResources, on_delete=models.PROTECT) + uid = models.ForeignKey(Users, db_column='uid', on_delete=models.PROTECT) comments = models.TextField() created_at = models.DateTimeField() diff --git a/certificate/migrations/0001_initial.py b/certificate/migrations/0001_initial.py index 0ab03a4b0..ab9f8defe 100644 --- a/certificate/migrations/0001_initial.py +++ b/certificate/migrations/0001_initial.py @@ -4,6 +4,7 @@ # Third Party Stuff from django.conf import settings from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -43,7 +44,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('uin', models.CharField(max_length=50)), ('attendance', models.NullBooleanField()), - ('user', models.OneToOneField(to=settings.AUTH_USER_MODEL)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], options={ }, diff --git a/certificate/migrations/0003_auto_20160816_1148.py b/certificate/migrations/0003_auto_20160816_1148.py index 675691860..1d9ead5fc 100644 --- a/certificate/migrations/0003_auto_20160816_1148.py +++ b/certificate/migrations/0003_auto_20160816_1148.py @@ -3,6 +3,7 @@ # Third Party Stuff from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -306,7 +307,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='answer', name='question', - field=models.ForeignKey(to='certificate.Question'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='certificate.Question'), preserve_default=True, ), migrations.AddField( diff --git a/cms/migrations/0001_initial.py b/cms/migrations/0001_initial.py index e3b5098a1..a9290ac2e 100644 --- a/cms/migrations/0001_initial.py +++ b/cms/migrations/0001_initial.py @@ -7,6 +7,7 @@ # Third Party Stuff from django.conf import settings from django.db import migrations, models +import django.db.models.deletion # Spoken Tutorial Stuff import cms.models @@ -48,7 +49,7 @@ class Migration(migrations.Migration): ('source_link', models.URLField(max_length=255, null=True, blank=True)), ('event_date', models.DateTimeField()), ('created', models.DateTimeField(auto_now_add=True)), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -76,7 +77,7 @@ class Migration(migrations.Migration): ('weight', models.PositiveIntegerField(default=3)), ('created', models.DateTimeField()), ('updated', models.DateTimeField()), - ('created_by', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'New', @@ -100,7 +101,7 @@ class Migration(migrations.Migration): ('expiry_date', models.DateField()), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -132,11 +133,11 @@ class Migration(migrations.Migration): ('thumb', models.FileField(null=True, upload_to=cms.models.profile_picture_thumb, blank=True)), ('address', models.TextField(null=True)), ('created', models.DateTimeField(auto_now_add=True)), - ('city', models.ForeignKey(to='events.City', null=True)), - ('district', models.ForeignKey(to='events.District', null=True)), - ('location', models.ForeignKey(to='events.Location', null=True)), - ('state', models.ForeignKey(to='events.State', null=True)), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('city', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.City', null=True)), + ('district', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.District', null=True)), + ('location', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Location', null=True)), + ('state', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.State', null=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -159,22 +160,22 @@ class Migration(migrations.Migration): ('target_new', models.BooleanField()), ('visible', models.BooleanField()), ('created', models.DateTimeField(auto_now_add=True)), - ('nav', models.ForeignKey(to='cms.Nav')), + ('nav', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='cms.Nav')), ], ), migrations.AddField( model_name='news', name='news_type', - field=models.ForeignKey(to='cms.NewsType'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='cms.NewsType'), ), migrations.AddField( model_name='news', name='state', - field=models.ForeignKey(blank=True, to='events.State', null=True), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, blank=True, to='events.State', null=True), ), migrations.AddField( model_name='block', name='block_location', - field=models.ForeignKey(to='cms.Block_Location'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='cms.Block_Location'), ), ] diff --git a/cms/models.py b/cms/models.py index 517b6b254..6abf2d449 100644 --- a/cms/models.py +++ b/cms/models.py @@ -8,7 +8,6 @@ # Third Party Stuff from django.contrib.auth.models import User from django.db import models -from django.utils.encoding import python_2_unicode_compatible # Spoken Tutorial Stuff from events.models import City, District, Location, State @@ -53,7 +52,6 @@ class Page(models.Model): visible = models.BooleanField() created = models.DateTimeField(auto_now_add=True) -@python_2_unicode_compatible class Block_Location(models.Model): name = models.CharField(max_length=255) visible = models.BooleanField() @@ -109,7 +107,6 @@ class Notification(models.Model): created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now = True) -@python_2_unicode_compatible class NewsType(models.Model): name = models.CharField(max_length = 50) slug = models.CharField(max_length = 50) diff --git a/cms/services.py b/cms/services.py index 2c2fb70e9..96339c6c8 100644 --- a/cms/services.py +++ b/cms/services.py @@ -27,7 +27,7 @@ def get_user_email(email): user = User.objects.filter(email__iexact=email) if len(user) == 1: return user[0] - return User.objects.get(email=email).first() + return User.objects.filter(email=email).first() except ObjectDoesNotExist: return None diff --git a/cms/templatetags/announcements.py b/cms/templatetags/announcements.py index 440d43735..a5e257387 100644 --- a/cms/templatetags/announcements.py +++ b/cms/templatetags/announcements.py @@ -8,7 +8,7 @@ register = template.Library() -@register.assignment_tag +@register.simple_tag def get_notifications(): return Notification.objects.filter(Q(start_date__lte=dt.datetime.today()) & Q( expiry_date__gte=dt.datetime.today())).order_by('expiry_date') diff --git a/cms/views.py b/cms/views.py index 1b96c3731..4e95a5f0e 100644 --- a/cms/views.py +++ b/cms/views.py @@ -256,7 +256,7 @@ def confirm(request, confirmation_code, username): def account_login(request): user = request.user error_msg = '' - if request.user.is_anonymous(): + if not request.user.is_authenticated: form = LoginForm() context = { 'form' : form @@ -386,7 +386,7 @@ def account_view_profile(request, username): 'profile' : profile, 'media_url' : settings.MEDIA_URL, } - if request.user.is_authenticated(): + if request.user.is_authenticated: payee_list = Payee.objects.prefetch_related('cdfosslanguages_set__foss','cdfosslanguages_set__lang').filter(user=request.user) context['payee_list'] = payee_list @@ -506,7 +506,7 @@ def change_password(request): user.backend = 'django.contrib.auth.backends.ModelBackend' login(request, user) - if request.user.is_anonymous(): + if not request.user.is_authenticated: return HttpResponseRedirect('/accounts/login/?next=/accounts/change-password/') if not profile: diff --git a/creation/admin.py b/creation/admin.py index c54a5ec4a..8d1c132ec 100644 --- a/creation/admin.py +++ b/creation/admin.py @@ -120,7 +120,9 @@ class DomainReviewerRoleAdmin(admin.ModelAdmin): list_display = ('user', 'foss_category', 'language', 'status', 'created', 'updated') list_filter = ('updated', 'language', 'foss_category') + ordering = ('-created',) + @admin.action(description="Mark selected domain reviewer roles as disabled") def mark_domain_reviewer_disabled(self, request, queryset): rows_updated = queryset.update(status=0) if rows_updated == 1: @@ -129,6 +131,7 @@ def mark_domain_reviewer_disabled(self, request, queryset): message_bit = "%s domain reviewer roles were" self.message_user(request, "%s successfully disabled." % message_bit) + @admin.action(description="Mark selected domain reviewer roles as active") def mark_domain_reviewer_active(self, request, queryset): rows_updated = queryset.update(status=1) if rows_updated == 1: @@ -136,12 +139,10 @@ def mark_domain_reviewer_active(self, request, queryset): else: message_bit = "%s domain reviewer roles were" self.message_user(request, "%s successfully activated." % message_bit) - mark_domain_reviewer_active.short_description = "Mark selected domain reviewer roles as active" - mark_domain_reviewer_disabled.short_description = "Mark selected domain reviewer roles as disabled" + actions = ['mark_domain_reviewer_active', 'mark_domain_reviewer_disabled'] class Media: - js = ('admin/js/domain_reviewer_languages.js', ) @@ -150,7 +151,9 @@ class QualityReviewerRoleAdmin(admin.ModelAdmin): list_display = ('user', 'foss_category', 'language', 'status', 'created', 'updated') list_filter = ('updated', 'language', 'foss_category') + ordering = ('-created',) + @admin.action(description="Mark selected quality reviewer roles as disabled") def mark_quality_reviewer_disabled(self, request, queryset): rows_updated = queryset.update(status=0) if rows_updated == 1: @@ -159,6 +162,7 @@ def mark_quality_reviewer_disabled(self, request, queryset): message_bit = "%s quality reviewer roles were" self.message_user(request, "%s successfully disabled." % message_bit) + @admin.action(description="Mark selected quality reviewer roles as active") def mark_quality_reviewer_active(self, request, queryset): rows_updated = queryset.update(status=1) if rows_updated == 1: @@ -166,14 +170,12 @@ def mark_quality_reviewer_active(self, request, queryset): else: message_bit = "%s quality reviewer roles were" self.message_user(request, "%s successfully activated." % message_bit) - mark_quality_reviewer_active.short_description = "Mark selected quality reviewer roles as active" - mark_quality_reviewer_disabled.short_description = "Mark selected quality reviewer roles as disabled" + actions = ['mark_quality_reviewer_active', 'mark_quality_reviewer_disabled'] class Media: - - js = ('admin/js/quality_reviewer_languages.js', ) + js = ('admin/js/quality_reviewer_languages.js', ) class FossAvailableForTestAdmin(admin.ModelAdmin): form = FossAvailableForTestForm diff --git a/creation/forms.py b/creation/forms.py index ea8bd066d..8aa57b950 100644 --- a/creation/forms.py +++ b/creation/forms.py @@ -1,8 +1,4 @@ - # Third Party Stuff -from builtins import str -from builtins import range -from builtins import object from django import forms from django.contrib.auth.models import User from django.db.models import Q @@ -117,151 +113,172 @@ def __init__(self, user, *args, **kwargs): class ChangeComponentStatusForm(forms.Form): foss_category = forms.ChoiceField( - choices = [('', ''),], + choices=[('', '')], widget=forms.Select(), - required = True, - error_messages = {'required':'FOSS category field is required.'} + required=True, + error_messages={'required': 'FOSS category field is required.'} ) tutorial_name = forms.ChoiceField( - choices = [('', 'Select Tutorial'),], - widget=forms.Select(attrs = {'disabled': 'disabled'}), - required = True, - error_messages = {'required': 'Tutorial Name field is required.'} + choices=[('', 'Select Tutorial')], + widget=forms.Select(attrs={'disabled': 'disabled'}), + required=True, + error_messages={'required': 'Tutorial Name field is required.'} ) language = forms.ChoiceField( - choices = [('', 'Select Language'),], - widget = forms.Select(attrs = {'disabled': 'disabled'}), - required = True, - error_messages = {'required': 'Language field is required.'} + choices=[('', 'Select Language')], + widget=forms.Select(attrs={'disabled': 'disabled'}), + required=True, + error_messages={'required': 'Language field is required.'} ) component = forms.ChoiceField( - choices = [('', 'Select Component'),], - widget = forms.Select(attrs = {'disabled': 'disabled'}), - required = True, - error_messages = {'required': 'Component field is required.'} + choices=[('', 'Select Component')], + widget=forms.Select(attrs={'disabled': 'disabled'}), + required=True, + error_messages={'required': 'Component field is required.'} ) status = forms.ChoiceField( - choices = [('', 'Select Status'),], - widget = forms.Select(attrs = {'disabled': 'disabled'}), - required = True, - error_messages = {'required': 'Status field is required.'} + choices=[('', 'Select Status')], + widget=forms.Select(attrs={'disabled': 'disabled'}), + required=True, + error_messages={'required': 'Status field is required.'} ) + def __init__(self, *args, **kwargs): - super(ChangeComponentStatusForm, self).__init__(*args, **kwargs) - foss_list = list(FossCategory.objects.filter(status = 1).values_list('id', 'foss').order_by('foss')) + super().__init__(*args, **kwargs) + foss_list = list(FossCategory.objects.filter(status=1).values_list('id', 'foss').order_by('foss')) foss_list.insert(0, ('', 'Select Foss')) self.fields['foss_category'].choices = foss_list - if args: - if 'foss_category' in args[0]: - if args[0]['foss_category']: - initial_data = '' - if 'language' in args[0]: - if args[0]['language']: - initial_data = args[0]['language'] - choices = list(Language.objects.filter(id__in = TutorialResource.objects.filter(tutorial_detail__in = TutorialDetail.objects.filter(foss_id = int(args[0]['foss_category'])).values_list('id'), status = 0).values_list('language_id').distinct()).values_list('id', 'name').order_by('name')) - if len(choices): - self.fields['language'].widget.attrs = {} - choices.insert(0, ('', 'Select Language')) - self.fields['language'].choices = choices - if initial_data: - self.fields['language'].initial = initial_data - lang = Language.objects.get(pk = initial_data) - tut_init_data = '' - if 'tutorial_name' in args[0]: - if args[0]['tutorial_name']: - tut_init_data = args[0]['tutorial_name'] - td_list = TutorialDetail.objects.filter(foss_id = args[0]['foss_category']).values_list('id') - choices = list(TutorialResource.objects.filter(tutorial_detail_id__in = td_list, language_id = initial_data, status = 0).distinct().values_list('tutorial_detail_id', 'tutorial_detail__tutorial')) - if len(choices): - self.fields['tutorial_name'].widget.attrs = {} - choices.insert(0, ('', 'Select Tutorial')) - self.fields['tutorial_name'].choices = choices - self.fields['tutorial_name'].initial = tut_init_data - comp_init_data = '' - if 'component' in args[0]: - if args[0]['component']: - comp_init_data = args[0]['component'] - if lang.name == 'English': - choices = [('outline', 'Outline'), ('script', 'Script'), ('slide', 'Slides'), ('video', 'Video'), ('code', 'Codefiles'), ('assignment', 'Assignment'), ('prerequisite', 'Prerequisite'), ('keyword', 'Keywords'), ('additional_material', 'Additional Material')] - else: - choices = [('outline', 'Outline'), ('script', 'Script'), ('video', 'Video')] - if len(choices): - self.fields['component'].widget.attrs = {} - choices.insert(0, ('', 'Select Component')) - self.fields['component'].choices = choices - self.fields['component'].initial = comp_init_data - if tut_init_data and comp_init_data: - status_init_data = '' - if 'status' in args[0]: - if args[0]['status']: - status_init_data = args[0]['status'] - tr_rec = TutorialResource.objects.select_related().get(tutorial_detail_id = tut_init_data, language = lang) - choices = [("0", 'Pending')] - compValue = None + if args and args[0]: + foss_id = args[0].get('foss_category') + if foss_id: + initial_lang = args[0].get('language', '') + choices = list( + Language.objects.filter( + id__in=TutorialResource.objects.filter( + tutorial_detail__in=TutorialDetail.objects.filter(foss_id=int(foss_id)).values_list('id'), + status=0 + ).values_list('language_id').distinct() + ).values_list('id', 'name').order_by('name') + ) + if choices: + self.fields['language'].widget.attrs = {} + choices.insert(0, ('', 'Select Language')) + self.fields['language'].choices = choices + if initial_lang: + self.fields['language'].initial = initial_lang + lang = Language.objects.filter(pk=initial_lang).first() + tut_init_data = args[0].get('tutorial_name', '') + td_list = TutorialDetail.objects.filter(foss_id=foss_id).values_list('id') + tut_choices = list( + TutorialResource.objects.filter( + tutorial_detail_id__in=td_list, + language_id=initial_lang, + status=0 + ).distinct().values_list('tutorial_detail_id', 'tutorial_detail__tutorial') + ) + if tut_choices: + self.fields['tutorial_name'].widget.attrs = {} + tut_choices.insert(0, ('', 'Select Tutorial')) + self.fields['tutorial_name'].choices = tut_choices + self.fields['tutorial_name'].initial = tut_init_data + + comp_init_data = args[0].get('component', '') + if lang and lang.name == 'English': + comp_choices = [ + ('outline', 'Outline'), ('script', 'Script'), ('slide', 'Slides'), + ('video', 'Video'), ('code', 'Codefiles'), ('assignment', 'Assignment'), + ('prerequisite', 'Prerequisite'), ('keyword', 'Keywords'), + ('additional_material', 'Additional Material') + ] + else: + comp_choices = [('outline', 'Outline'), ('script', 'Script'), ('video', 'Video')] + if comp_choices: + self.fields['component'].widget.attrs = {} + comp_choices.insert(0, ('', 'Select Component')) + self.fields['component'].choices = comp_choices + self.fields['component'].initial = comp_init_data + + if tut_init_data and comp_init_data: + status_init_data = args[0].get('status', '') + tr_rec = TutorialResource.objects.select_related('tutorial_detail', 'common_content').filter( + tutorial_detail_id=tut_init_data, language_id=initial_lang + ).first() + status_choices = [("0", 'Pending')] + if tr_rec: if comp_init_data in ['outline', 'script', 'video']: - compValue = getattr(tr_rec, comp_init_data + '_status') + comp_val = getattr(tr_rec, comp_init_data + '_status', None) + elif hasattr(tr_rec, 'common_content') and tr_rec.common_content: + comp_val = getattr(tr_rec.common_content, comp_init_data + '_status', None) else: - compValue = getattr(tr_rec.common_content, comp_init_data + '_status') - if compValue: - choices.append(("5", 'Need Improvement')) - if comp_init_data in ['code', 'assignment','additional_material']: - choices.append(("6", 'Not Required')) - if len(choices): - self.fields['status'].widget.attrs = {} - choices.insert(0, ('', 'Select Status')) - self.fields['status'].choices =choices - self.fields['status'].initial = status_init_data + comp_val = None + if comp_val: + status_choices.append(("5", 'Need Improvement')) + if comp_init_data in ['code', 'assignment', 'additional_material']: + status_choices.append(("6", 'Not Required')) + if status_choices: + self.fields['status'].widget.attrs = {} + status_choices.insert(0, ('', 'Select Status')) + self.fields['status'].choices = status_choices + self.fields['status'].initial = status_init_data class PublishToPending(forms.Form): foss_category = forms.ChoiceField( widget=forms.Select(), - required = True, - error_messages = {'required':'FOSS category field is required.'} + required=True, + error_messages={'required': 'FOSS category field is required.'} ) tutorial_name = forms.ChoiceField( - choices = [('', 'Select Tutorial'),], - widget=forms.Select(attrs = {'disabled': 'disabled'}), - required = True, - error_messages = {'required': 'Tutorial Name field is required.'} + choices=[('', 'Select Tutorial')], + widget=forms.Select(attrs={'disabled': 'disabled'}), + required=True, + error_messages={'required': 'Tutorial Name field is required.'} ) language = forms.ChoiceField( - choices = [('', 'Select Language'),], - widget = forms.Select(attrs = {'disabled': 'disabled'}), - required = True, - error_messages = {'required': 'Language field is required.'} + choices=[('', 'Select Language')], + widget=forms.Select(attrs={'disabled': 'disabled'}), + required=True, + error_messages={'required': 'Language field is required.'} ) + def __init__(self, *args, **kwargs): - super(PublishToPending, self).__init__(*args, **kwargs) - foss_list = list(FossCategory.objects.filter(status = 1).values_list('id', 'foss').order_by('foss')) + super().__init__(*args, **kwargs) + foss_list = list(FossCategory.objects.filter(status=1).values_list('id', 'foss').order_by('foss')) foss_list.insert(0, ('', 'Select Foss Category')) self.fields['foss_category'].choices = foss_list - if args: - if 'foss_category' in args[0]: - if args[0]['foss_category'] and args[0]['foss_category'] != '' and args[0]['foss_category'] != 'None': - initial_data = '' - if 'language' in args[0]: - if args[0]['language'] and args[0]['language'] != '' and args[0]['language'] != 'None': - initial_data = args[0]['language'] - choices = list(Language.objects.filter(id__in = TutorialResource.objects.filter(tutorial_detail__in = TutorialDetail.objects.filter(foss_id = int(args[0]['foss_category'])).values_list('id'), status = 1).values_list('language_id').distinct()).values_list('id', 'name')) - if len(choices): - self.fields['language'].widget.attrs = {} - choices.insert(0, ('', 'Select Language')) - self.fields['language'].choices = choices - if initial_data: - self.fields['language'].initial = initial_data - tut_init_data = '' - if 'tutorial_name' in args[0]: - if args[0]['tutorial_name'] and args[0]['tutorial_name'] != '' and args[0]['tutorial_name'] != 'None': - tut_init_data = args[0]['tutorial_name'] - td_list = TutorialDetail.objects.filter(foss_id = args[0]['foss_category']).values_list('id') - choices = list(TutorialResource.objects.filter(tutorial_detail_id__in = td_list, language_id = initial_data, status = 1).distinct().values_list('tutorial_detail_id', 'tutorial_detail__tutorial')) - if len(choices): - self.fields['tutorial_name'].widget.attrs = {} - choices.insert(0, ('', 'Select Tutorial')) - self.fields['tutorial_name'].choices = choices - self.fields['tutorial_name'].initial = tut_init_data + if args and args[0]: + foss_id = args[0].get('foss_category') + if foss_id and foss_id != 'None': + initial_lang = args[0].get('language', '') + choices = list( + Language.objects.filter( + id__in=TutorialResource.objects.filter( + tutorial_detail__in=TutorialDetail.objects.filter(foss_id=int(foss_id)).values_list('id'), + status=1 + ).values_list('language_id').distinct() + ).values_list('id', 'name') + ) + if choices: + self.fields['language'].widget.attrs = {} + choices.insert(0, ('', 'Select Language')) + self.fields['language'].choices = choices + if initial_lang and initial_lang != 'None': + self.fields['language'].initial = initial_lang + tut_init_data = args[0].get('tutorial_name', '') + td_list = TutorialDetail.objects.filter(foss_id=foss_id).values_list('id') + tut_choices = list( + TutorialResource.objects.filter( + tutorial_detail_id__in=td_list, + language_id=initial_lang, + status=1 + ).distinct().values_list('tutorial_detail_id', 'tutorial_detail__tutorial') + ) + if tut_choices: + self.fields['tutorial_name'].widget.attrs = {} + tut_choices.insert(0, ('', 'Select Tutorial')) + self.fields['tutorial_name'].choices = tut_choices + self.fields['tutorial_name'].initial = tut_init_data class UploadPublishTutorialForm(forms.Form): @@ -584,55 +601,52 @@ class Meta(object): class DomainReviewerRoleForm(forms.ModelForm): user = forms.ModelChoiceField( - - queryset = User.objects.filter(Q(groups__name = 'Domain-Reviewer')).order_by('username'), - help_text = "", - error_messages = {'required': 'User field required.'} + queryset=User.objects.filter(Q(groups__name='Domain-Reviewer')).order_by('username'), + help_text="", + error_messages={'required': 'User field required.'} ) foss_category = forms.ModelChoiceField( - - queryset = FossCategory.objects.filter(status = 1).order_by('foss'), - empty_label = "----------", - help_text = "", - error_messages = {'required': 'FOSS category field required.'} + queryset=FossCategory.objects.filter(status=1).order_by('foss'), + empty_label="----------", + help_text="", + error_messages={'required': 'FOSS category field required.'} ) language = forms.ModelChoiceField( - - queryset = Language.objects.order_by('name'), - empty_label = "----------", - help_text = "", error_messages = {'required': 'Language field required.'} + queryset=Language.objects.order_by('name'), + empty_label="----------", + help_text="", + error_messages={'required': 'Language field required.'} ) - status = forms.BooleanField(required = False) + status = forms.BooleanField(required=False) - class Meta(object): + class Meta: model = DomainReviewerRole - exclude = ['created', 'updated'] + fields = ['user', 'foss_category', 'language', 'status'] + class QualityReviewerRoleForm(forms.ModelForm): user = forms.ModelChoiceField( - - queryset = User.objects.filter(Q(groups__name = 'Quality-Reviewer')).order_by('username'), - help_text = "", error_messages = {'required': 'User field required.'} + queryset=User.objects.filter(Q(groups__name='Quality-Reviewer')).order_by('username'), + help_text="", + error_messages={'required': 'User field required.'} ) foss_category = forms.ModelChoiceField( - - queryset = FossCategory.objects.filter(status = 1).order_by('foss'), - empty_label = "----------", - help_text = "", - error_messages = {'required': 'FOSS category field required.'} + queryset=FossCategory.objects.filter(status=1).order_by('foss'), + empty_label="----------", + help_text="", + error_messages={'required': 'FOSS category field required.'} ) language = forms.ModelChoiceField( - - queryset = Language.objects.order_by('name'), - empty_label = "----------", - help_text = "", - error_messages = {'required': 'Language field required.'} + queryset=Language.objects.order_by('name'), + empty_label="----------", + help_text="", + error_messages={'required': 'Language field required.'} ) - status = forms.BooleanField(required = False) + status = forms.BooleanField(required=False) - class Meta(object): + class Meta: model = QualityReviewerRole - exclude = ['created', 'updated'] + fields = ['user', 'foss_category', 'language', 'status'] class ReviewVideoForm(forms.Form): video_status = forms.ChoiceField( @@ -696,29 +710,26 @@ class TutorialMissingComponentForm(forms.Form): email = forms.EmailField(required = False, error_messages = {'required': 'Please fill the Email field'}) def __init__(self, user, *args, **kwargs): - super(TutorialMissingComponentForm, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.user = user def clean(self): - super(TutorialMissingComponentForm, self).clean() - print((self.user)) - if 'report_type' in self.cleaned_data: - if self.cleaned_data['report_type'] == '1': - if 'remarks' in self.cleaned_data: - if not self.cleaned_data['remarks']: - self._errors['remarks'] = '' - else: - self._errors['remarks'] = '' - if 'inform_me' in self.cleaned_data: - print((self.cleaned_data)) - if self.cleaned_data['inform_me'] == '1': - print((self.cleaned_data['inform_me'])) - if not self.user.is_authenticated(): - if 'email' in self.cleaned_data: - if not self.cleaned_data['email']: - self._errors['email'] = '' - else: - self._errors['email'] = '' + cleaned_data = super().clean() + report_type = str(cleaned_data.get('report_type', '')) + remarks = cleaned_data.get('remarks') + if report_type == '1' and not remarks: + self.add_error('remarks', 'Please fill Remarks field') + + inform_me = str(cleaned_data.get('inform_me', '')) + if inform_me == '1': + user_auth = getattr(self.user, 'is_authenticated', False) + if callable(user_auth): + user_auth = user_auth() + if not user_auth: + email = cleaned_data.get('email') + if not email: + self.add_error('email', 'Please fill Email field') + return cleaned_data class TutorialMissingComponentReplyForm(forms.Form): reply_message = forms.CharField( @@ -799,121 +810,125 @@ class AvailableFossForm(forms.ModelForm): error_messages = {'required': 'FOSS category field required.'} ) + class Meta(object): + model = TutorialDetail + fields = '__all__' + class UpdatePrerequisiteForm(forms.Form): source_foss = forms.ChoiceField( - choices = [('', '-- Select Foss --'),] + list(FossCategory.objects.filter(status=1).values_list('id', 'foss').order_by('foss')), - required = True, - error_messages = {'required':'FOSS category field is required.'} + choices=[('', '-- Select Foss --')] + list(FossCategory.objects.filter(status=1).values_list('id', 'foss').order_by('foss')), + required=True, + error_messages={'required': 'FOSS category field is required.'} ) source_tutorial = forms.ChoiceField( - choices = [('', '-- Select Tutorial --'),], - widget=forms.Select(attrs = {'disabled': 'disabled'}), - required = True, - error_messages = {'required': 'Tutorial Name field is required.'} + choices=[('', '-- Select Tutorial --')], + widget=forms.Select(attrs={'disabled': 'disabled'}), + required=True, + error_messages={'required': 'Tutorial Name field is required.'} ) destination_foss = forms.ChoiceField( - choices = [('', '-- Select Foss --'), ('0', '-- Not Required --'),] + list(FossCategory.objects.filter(status=1).values_list('id', 'foss').order_by('foss')), - required = True, - error_messages = {'required':'FOSS category field is required.'} + choices=[('', '-- Select Foss --'), ('0', '-- Not Required --')] + list(FossCategory.objects.filter(status=1).values_list('id', 'foss').order_by('foss')), + required=True, + error_messages={'required': 'FOSS category field is required.'} ) destination_tutorial = forms.ChoiceField( - choices = [('', '-- Select Tutorial --'), ('0', '-- Not Required --'),], - widget=forms.Select(attrs = {'disabled': 'disabled'}), - required = True, - error_messages = {'required': 'Tutorial Name field is required.'} + choices=[('', '-- Select Tutorial --'), ('0', '-- Not Required --')], + widget=forms.Select(attrs={'disabled': 'disabled'}), + required=True, + error_messages={'required': 'Tutorial Name field is required.'} ) def __init__(self, *args, **kwargs): - super(UpdatePrerequisiteForm, self).__init__(*args, **kwargs) - if args: - if 'source_foss' in args[0]: - if args[0]['source_foss'] and args[0]['source_foss'] != '' and args[0]['source_foss'] != 'None': - initial_data = '' - td_list = TutorialDetail.objects.filter(foss_id = args[0]['source_foss']).values_list('id') - lang_rec = Language.objects.get(name = 'English') + super().__init__(*args, **kwargs) + if args and args[0]: + source_foss = args[0].get('source_foss') + if source_foss and source_foss != 'None': + initial_data = args[0].get('source_tutorial', '') + td_list = TutorialDetail.objects.filter(foss_id=source_foss).values_list('id') + lang_rec = Language.objects.filter(name='English').first() + if lang_rec: choices = list( TutorialDetail.objects.filter( - id__in = TutorialResource.objects.filter( - tutorial_detail_id__in = td_list, - language_id = lang_rec.id, - ).values_list( - 'tutorial_detail_id' - ) - ).values_list( - 'id', - 'tutorial' - ) + id__in=TutorialResource.objects.filter( + tutorial_detail_id__in=td_list, + language_id=lang_rec.id, + ).values_list('tutorial_detail_id') + ).values_list('id', 'tutorial').order_by('tutorial') ) choices.insert(0, ('', 'Select Tutorial')) self.fields['source_tutorial'].choices = choices - self.fields['source_tutorial'].widget.attrs = {} + if choices: + self.fields['source_tutorial'].widget.attrs = {} self.fields['source_tutorial'].initial = initial_data - if 'destination_foss' in args[0]: - if args[0]['destination_foss'] and args[0]['destination_foss'] != '' and args[0]['destination_foss'] != 'None': - initial_data = '' - td_list = TutorialDetail.objects.filter(foss_id = args[0]['destination_foss']).values_list('id') - lang_rec = Language.objects.get(name = 'English') - choices = list( - TutorialDetail.objects.filter( - id__in = TutorialResource.objects.filter( - tutorial_detail_id__in = td_list, - language_id = lang_rec.id, - ).values_list( - 'tutorial_detail_id' - ) - ).values_list( - 'id', - 'tutorial' - ) - ) - choices.insert(0, ('', '-- Select Tutorial --')) - choices.insert(1, ('0', '-- Not Required --')) - self.fields['destination_tutorial'].choices = choices + + dest_foss = args[0].get('destination_foss') + if dest_foss and dest_foss != 'None': + initial_data = args[0].get('destination_tutorial', '') + if dest_foss == '0': + self.fields['destination_tutorial'].choices = [('', '-- Select Tutorial --'), ('0', '-- Not Required --')] self.fields['destination_tutorial'].widget.attrs = {} - self.fields['destination_tutorial'].initial = initial_data + self.fields['destination_tutorial'].initial = '0' + else: + td_list = TutorialDetail.objects.filter(foss_id=dest_foss).values_list('id') + lang_rec = Language.objects.filter(name='English').first() + if lang_rec: + choices = list( + TutorialDetail.objects.filter( + id__in=TutorialResource.objects.filter( + tutorial_detail_id__in=td_list, + language_id=lang_rec.id, + ).values_list('tutorial_detail_id') + ).values_list('id', 'tutorial').order_by('tutorial') + ) + choices.insert(0, ('', '-- Select Tutorial --')) + choices.insert(1, ('0', '-- Not Required --')) + self.fields['destination_tutorial'].choices = choices + if choices: + self.fields['destination_tutorial'].widget.attrs = {} + self.fields['destination_tutorial'].initial = initial_data class UpdateKeywordsForm(forms.Form): foss = forms.ChoiceField( - choices = [('', '-- Select Foss --'),] + list(FossCategory.objects.filter(status=1).values_list('id', 'foss').order_by('foss')), - required = True, - error_messages = {'required':'FOSS category field is required.'} + choices=[('', '-- Select Foss --')] + list(FossCategory.objects.filter(status=1).values_list('id', 'foss').order_by('foss')), + required=True, + error_messages={'required': 'FOSS category field is required.'} ) tutorial = forms.ChoiceField( - choices = [('', '-- Select Tutorial --'),], - widget=forms.Select(attrs = {'disabled': 'disabled'}), - required = True, - error_messages = {'required': 'Tutorial Name field is required.'} + choices=[('', '-- Select Tutorial --')], + widget=forms.Select(attrs={'disabled': 'disabled'}), + required=True, + error_messages={'required': 'Tutorial Name field is required.'} ) keywords = forms.CharField( - widget = forms.Textarea, - required = True, - error_messages = {'required':'Keywords field required'} + widget=forms.Textarea, + required=True, + error_messages={'required': 'Keywords field required'} ) def __init__(self, *args, **kwargs): - super(UpdateKeywordsForm, self).__init__(*args, **kwargs) - if args: - if 'foss' in args[0] and args[0]['foss']: - initial_data = '' - if 'tutorial' in args[0] and args[0]['tutorial']: - initial_data = args[0]['tutorial'] - choices = TutorialResource.objects.filter( - tutorial_detail__foss_id = args[0]['foss'], - language__name = 'English' - ).values_list('tutorial_detail_id', 'tutorial_detail__tutorial').order_by('tutorial_detail__tutorial') - self.fields['tutorial'].choices = choices - self.fields['tutorial'].widget.attrs = {} + super().__init__(*args, **kwargs) + if args and args[0]: + foss_id = args[0].get('foss') + if foss_id: + initial_data = args[0].get('tutorial', '') + choices = list(TutorialResource.objects.filter( + tutorial_detail__foss_id=foss_id, + language__name='English' + ).values_list('tutorial_detail_id', 'tutorial_detail__tutorial').order_by('tutorial_detail__tutorial')) + self.fields['tutorial'].choices = [('', '-- Select Tutorial --')] + choices + if choices: + self.fields['tutorial'].widget.attrs = {} self.fields['tutorial'].initial = initial_data class UpdateSheetsForm(forms.Form): foss = forms.ChoiceField( - choices = [('', '-- Select Foss --'),] + list(TutorialResource.objects.filter(Q(status = 1) | Q(status = 2), language__name='English').values_list('tutorial_detail__foss_id', 'tutorial_detail__foss__foss').order_by('tutorial_detail__foss__foss').distinct()), - required = True, - error_messages = {'required':'FOSS category field is required.'} + choices=[('', '-- Select Foss --')] + list(TutorialResource.objects.filter(Q(status=1) | Q(status=2), language__name='English').values_list('tutorial_detail__foss_id', 'tutorial_detail__foss__foss').order_by('tutorial_detail__foss__foss').distinct()), + required=True, + error_messages={'required': 'FOSS category field is required.'} ) language = forms.ChoiceField( - choices=[('', '-- Select Language --'), ], + choices=[('', '-- Select Language --')], widget=forms.Select(attrs={'disabled': 'disabled'}), required=True, error_messages={'required': 'Language field is required.'} @@ -921,42 +936,37 @@ class UpdateSheetsForm(forms.Form): comp = forms.FileField(required=False) def clean(self): - super(UpdateSheetsForm, self).clean() + cleaned_data = super().clean() file_types = ['application/pdf'] - component = '' - if 'comp' in self.cleaned_data: - component = self.cleaned_data['comp'] + component = cleaned_data.get('comp') if component: - if not component.content_type in file_types: - self._errors["comp"] = self.error_class(["Not a valid file format."]) + if component.content_type not in file_types and not component.name.lower().endswith('.pdf'): + self.add_error('comp', "Not a valid file format. Please upload a PDF file.") else: - self._errors["comp"] = self.error_class(["This field is required."]) - return component + self.add_error('comp', "This field is required.") + return cleaned_data def __init__(self, *args, **kwargs): - super(UpdateSheetsForm, self).__init__(*args, **kwargs) - - if args: - if 'foss' in args[0] and args[0]['foss']: - initial_lang = '' - if 'language' in args[0] and args[0]['language']: - initial_lang = args[0]['language'] - choices = TutorialResource.objects.filter(Q(status = 1) | Q(status = 2), tutorial_detail__foss_id = args[0]['foss']).values_list('language_id', 'language__name').order_by('language__name').distinct() - self.fields['language'].choices = [('', '-- Select Language --'),] + list(choices) - self.fields['language'].widget.attrs = {} + super().__init__(*args, **kwargs) + + if args and args[0]: + foss_id = args[0].get('foss') + if foss_id: + initial_lang = args[0].get('language', '') + choices = list(TutorialResource.objects.filter(Q(status=1) | Q(status=2), tutorial_detail__foss_id=foss_id).values_list('language_id', 'language__name').order_by('language__name').distinct()) + self.fields['language'].choices = [('', '-- Select Language --')] + choices + if choices: + self.fields['language'].widget.attrs = {} self.fields['language'].initial = initial_lang class UpdateAssignmentForm(forms.Form): foss = forms.ChoiceField( - choices = [('', '-- Select Foss --'),] + list(TutorialResource.objects.filter(Q(status = 1) | - Q(status = 2), language__name='English').values_list( - 'tutorial_detail__foss_id', 'tutorial_detail__foss__foss').order_by( - 'tutorial_detail__foss__foss').distinct()), - required = True, - error_messages = {'required':'FOSS category field is required.'} + choices=[('', '-- Select Foss --')] + list(TutorialResource.objects.filter(Q(status=1) | Q(status=2), language__name='English').values_list('tutorial_detail__foss_id', 'tutorial_detail__foss__foss').order_by('tutorial_detail__foss__foss').distinct()), + required=True, + error_messages={'required': 'FOSS category field is required.'} ) tutorial = forms.ChoiceField( - choices=[('', '-- Select Tutorial --'), ], + choices=[('', '-- Select Tutorial --')], widget=forms.Select(attrs={'disabled': 'disabled'}), required=True, error_messages={'required': 'Tutorial field is required.'} @@ -964,25 +974,23 @@ class UpdateAssignmentForm(forms.Form): comp = forms.FileField(required=False) def clean(self): - super(UpdateAssignmentForm, self).clean() - component = '' - if 'comp' in self.cleaned_data: - component = self.cleaned_data['comp'] + cleaned_data = super().clean() + component = cleaned_data.get('comp') if not component: - self._errors["comp"] = self.error_class(["This field is required."]) - return component + self.add_error('comp', "This field is required.") + return cleaned_data def __init__(self, *args, **kwargs): - super(UpdateAssignmentForm, self).__init__(*args, **kwargs) - - if args: - if 'foss' in args[0] and args[0]['foss']: - initial_tut = '' - if 'tutorial' in args[0] and args[0]['tutorial']: - initial_tut = args[0]['tutorial'] - choices = TutorialResource.objects.filter(Q(status = 1) | Q(status = 2), tutorial_detail__foss_id = args[0]['foss']).values_list('tutorial_detail_id', 'tutorial_detail__tutorial').order_by('tutorial_detail__tutorial').distinct() - self.fields['tutorial'].choices = [('', '-- Select tutorial --'),] + list(choices) - self.fields['tutorial'].widget.attrs = {} + super().__init__(*args, **kwargs) + + if args and args[0]: + foss_id = args[0].get('foss') + if foss_id: + initial_tut = args[0].get('tutorial', '') + choices = list(TutorialResource.objects.filter(Q(status=1) | Q(status=2), tutorial_detail__foss_id=foss_id).values_list('tutorial_detail_id', 'tutorial_detail__tutorial').order_by('tutorial_detail__tutorial').distinct()) + self.fields['tutorial'].choices = [('', '-- Select tutorial --')] + choices + if choices: + self.fields['tutorial'].widget.attrs = {} self.fields['tutorial'].initial = initial_tut @@ -1040,11 +1048,12 @@ def __init__(self, *args, **kwargs): self.fields['language'].choices = language_list def clean(self): - super(PublishedTutorialFilterForm, self).clean() + cleaned_data = super(PublishedTutorialFilterForm, self).clean() s_date = self.cleaned_data.get('start_date') e_date = self.cleaned_data.get('end_date') if s_date and e_date and s_date > e_date: - raise forms.ValidationError('End date must be later') + self.add_error('end_date', 'End date must be later') + return cleaned_data class PaymentHonorariumFilterForm(forms.Form): contributor = forms.ChoiceField( @@ -1083,24 +1092,22 @@ def __init__(self, *args, **kwargs): self.fields['contributor'].choices = contributor_list def clean(self): - super(PaymentHonorariumFilterForm, self).clean() + cleaned_data = super(PaymentHonorariumFilterForm, self).clean() s_date = self.cleaned_data.get('start_date') e_date = self.cleaned_data.get('end_date') if s_date and e_date and s_date > e_date: self.add_error('end_date', "End date must be later than start date.") + return cleaned_data class UpdateCodefilesForm(forms.Form): foss = forms.ChoiceField( - choices = [('', '-- Select Foss --'),] + list(TutorialResource.objects.filter(Q(status = 1) | - Q(status = 2), language__name='English').values_list( - 'tutorial_detail__foss_id', 'tutorial_detail__foss__foss').order_by( - 'tutorial_detail__foss__foss').distinct()), - required = True, - error_messages = {'required':'FOSS category field is required.'} + choices=[('', '-- Select Foss --')] + list(TutorialResource.objects.filter(Q(status=1) | Q(status=2), language__name='English').values_list('tutorial_detail__foss_id', 'tutorial_detail__foss__foss').order_by('tutorial_detail__foss__foss').distinct()), + required=True, + error_messages={'required': 'FOSS category field is required.'} ) tutorial = forms.ChoiceField( - choices=[('', '-- Select Tutorial --'), ], + choices=[('', '-- Select Tutorial --')], widget=forms.Select(attrs={'disabled': 'disabled'}), required=True, error_messages={'required': 'Tutorial field is required.'} @@ -1108,70 +1115,63 @@ class UpdateCodefilesForm(forms.Form): comp = forms.FileField(required=False) def clean(self): - super(UpdateCodefilesForm, self).clean() - component = '' - if 'comp' in self.cleaned_data: - component = self.cleaned_data['comp'] + cleaned_data = super().clean() + component = cleaned_data.get('comp') if not component: - self._errors["comp"] = self.error_class(["This field is required."]) - return component + self.add_error('comp', "This field is required.") + return cleaned_data def __init__(self, *args, **kwargs): - super(UpdateCodefilesForm, self).__init__(*args, **kwargs) - - if args: - if 'foss' in args[0] and args[0]['foss']: - initial_tut = '' - if 'tutorial' in args[0] and args[0]['tutorial']: - initial_tut = args[0]['tutorial'] - choices = TutorialResource.objects.filter(Q(status = 1) | Q(status = 2), tutorial_detail__foss_id = args[0]['foss']).values_list('tutorial_detail_id', 'tutorial_detail__tutorial').order_by('tutorial_detail__tutorial').distinct() - self.fields['tutorial'].choices = [('', '-- Select tutorial --'),] + list(choices) - self.fields['tutorial'].widget.attrs = {} + super().__init__(*args, **kwargs) + + if args and args[0]: + foss_id = args[0].get('foss') + if foss_id: + initial_tut = args[0].get('tutorial', '') + choices = list(TutorialResource.objects.filter(Q(status=1) | Q(status=2), tutorial_detail__foss_id=foss_id).values_list('tutorial_detail_id', 'tutorial_detail__tutorial').order_by('tutorial_detail__tutorial').distinct()) + self.fields['tutorial'].choices = [('', '-- Select tutorial --')] + choices + if choices: + self.fields['tutorial'].widget.attrs = {} self.fields['tutorial'].initial = initial_tut class UpdateCommonCompForm(forms.Form): foss = forms.ChoiceField( - choices = [('', '-- Select Foss --'),] + list(TutorialResource.objects.filter(Q(status = 1) | - Q(status = 2), language__name='English').values_list( - 'tutorial_detail__foss_id', 'tutorial_detail__foss__foss').order_by( - 'tutorial_detail__foss__foss').distinct()), - required = True, - error_messages = {'required':'FOSS category field is required.'} + choices=[('', '-- Select Foss --')] + list(TutorialResource.objects.filter(Q(status=1) | Q(status=2), language__name='English').values_list('tutorial_detail__foss_id', 'tutorial_detail__foss__foss').order_by('tutorial_detail__foss__foss').distinct()), + required=True, + error_messages={'required': 'FOSS category field is required.'} ) tutorial = forms.ChoiceField( - choices=[('', '-- Select Tutorial --'), ], + choices=[('', '-- Select Tutorial --')], widget=forms.Select(attrs={'disabled': 'disabled'}), required=True, error_messages={'required': 'Tutorial field is required.'} ) comp = forms.FileField(required=False) component_type = forms.ChoiceField( - choices = [('', '-- Select Type --'), ('Codefiles', 'Codefiles'), ('Slides', 'Slides'), ('Additionalmaterial', 'Additional Material')], - required = True, - error_messages = {'required': 'Please select component type'} + choices=[('', '-- Select Type --'), ('Codefiles', 'Codefiles'), ('Slides', 'Slides'), ('Additionalmaterial', 'Additional Material')], + required=True, + error_messages={'required': 'Please select component type'} ) def clean(self): - super(UpdateCommonCompForm, self).clean() - component = '' - if 'comp' in self.cleaned_data: - component = self.cleaned_data['comp'] + cleaned_data = super().clean() + component = cleaned_data.get('comp') if not component: - self._errors["comp"] = self.error_class(["This field is required."]) - return component + self.add_error('comp', "This field is required.") + return cleaned_data def __init__(self, *args, **kwargs): - super(UpdateCommonCompForm, self).__init__(*args, **kwargs) - - if args: - if 'foss' in args[0] and args[0]['foss']: - initial_tut = '' - if 'tutorial' in args[0] and args[0]['tutorial']: - initial_tut = args[0]['tutorial'] - choices = TutorialResource.objects.filter(Q(status = 1) | Q(status = 2), tutorial_detail__foss_id = args[0]['foss']).values_list('tutorial_detail_id', 'tutorial_detail__tutorial').order_by('tutorial_detail__tutorial').distinct() - self.fields['tutorial'].choices = [('', '-- Select tutorial --'),] + list(choices) - self.fields['tutorial'].widget.attrs = {} + super().__init__(*args, **kwargs) + + if args and args[0]: + foss_id = args[0].get('foss') + if foss_id: + initial_tut = args[0].get('tutorial', '') + choices = list(TutorialResource.objects.filter(Q(status=1) | Q(status=2), tutorial_detail__foss_id=foss_id).values_list('tutorial_detail_id', 'tutorial_detail__tutorial').order_by('tutorial_detail__tutorial').distinct()) + self.fields['tutorial'].choices = [('', '-- Select tutorial --')] + choices + if choices: + self.fields['tutorial'].widget.attrs = {} self.fields['tutorial'].initial = initial_tut class LanguageManagerForm(forms.ModelForm): @@ -1226,22 +1226,19 @@ class Meta(): class UpdateThumbnailForm(forms.Form): foss = forms.ChoiceField( - choices = [('', '-- Select Foss --'),] + list(TutorialResource.objects.filter(Q(status = 1) | - Q(status = 2), language__name='English').values_list( - 'tutorial_detail__foss_id', 'tutorial_detail__foss__foss').order_by( - 'tutorial_detail__foss__foss').distinct()), - required = True, - error_messages = {'required':'FOSS category field is required.'} + choices=[('', '-- Select Foss --')] + list(TutorialResource.objects.filter(Q(status=1) | Q(status=2), language__name='English').values_list('tutorial_detail__foss_id', 'tutorial_detail__foss__foss').order_by('tutorial_detail__foss__foss').distinct()), + required=True, + error_messages={'required': 'FOSS category field is required.'} ) tutorial = forms.ChoiceField( - choices=[('', '-- Select Tutorial --'), ], + choices=[('', '-- Select Tutorial --')], widget=forms.Select(attrs={'disabled': 'disabled'}), required=True, error_messages={'required': 'Tutorial field is required.'} ) def __init__(self, *args, **kwargs): - super(UpdateThumbnailForm, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) tmp_choices1 = [] tmp_choices2 = [] for i in range(60): @@ -1252,23 +1249,23 @@ def __init__(self, *args, **kwargs): tmp_choices2.append((i_str, i_str)) tmp_choices1.insert(0, ('', 'Select Minutes')) self.fields['thumb_mins'] = forms.ChoiceField( - choices = tmp_choices1, + choices=tmp_choices1, widget=forms.Select(), - required = True, + required=True, ) tmp_choices2.insert(0, ('', 'Select Seconds')) self.fields['thumb_secs'] = forms.ChoiceField( - choices = tmp_choices2, + choices=tmp_choices2, widget=forms.Select(), - required = True, + required=True, ) - if args: - if 'foss' in args[0] and args[0]['foss']: - initial_tut = '' - if 'tutorial' in args[0] and args[0]['tutorial']: - initial_tut = args[0]['tutorial'] - choices = TutorialResource.objects.filter(Q(status = 1) | Q(status = 2), tutorial_detail__foss_id = args[0]['foss']).values_list('tutorial_detail_id', 'tutorial_detail__tutorial').order_by('tutorial_detail__tutorial').distinct() - self.fields['tutorial'].choices = [('', '-- Select tutorial --'),] + list(choices) - self.fields['tutorial'].widget.attrs = {} + if args and args[0]: + foss_id = args[0].get('foss') + if foss_id: + initial_tut = args[0].get('tutorial', '') + choices = list(TutorialResource.objects.filter(Q(status=1) | Q(status=2), tutorial_detail__foss_id=foss_id).values_list('tutorial_detail_id', 'tutorial_detail__tutorial').order_by('tutorial_detail__tutorial').distinct()) + self.fields['tutorial'].choices = [('', '-- Select tutorial --')] + choices + if choices: + self.fields['tutorial'].widget.attrs = {} self.fields['tutorial'].initial = initial_tut \ No newline at end of file diff --git a/creation/migrations/0001_initial.py b/creation/migrations/0001_initial.py index 3858c2025..1c69e6496 100644 --- a/creation/migrations/0001_initial.py +++ b/creation/migrations/0001_initial.py @@ -4,6 +4,7 @@ # Third Party Stuff from django.conf import settings from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -152,7 +153,7 @@ class Migration(migrations.Migration): ('status', models.BooleanField(max_length=2)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], options={ 'ordering': ('foss',), @@ -167,7 +168,7 @@ class Migration(migrations.Migration): ('code', models.CharField(default=b'en', max_length=10)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], options={ 'ordering': ('name',), @@ -208,8 +209,8 @@ class Migration(migrations.Migration): ('playlist_id', models.CharField(max_length=255)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('foss', models.ForeignKey(to='creation.FossCategory')), - ('language', models.ForeignKey(to='creation.Language')), + ('foss', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.FossCategory')), + ('language', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.Language')), ], options={ 'verbose_name': 'Playlist Info', @@ -222,7 +223,7 @@ class Migration(migrations.Migration): ('item_id', models.CharField(max_length=255)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('playlist', models.ForeignKey(to='creation.PlaylistInfo')), + ('playlist', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.PlaylistInfo')), ], options={ 'verbose_name': 'Playlist Item', @@ -258,9 +259,9 @@ class Migration(migrations.Migration): ('status', models.BooleanField()), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('foss_category', models.ForeignKey(to='creation.FossCategory')), - ('language', models.ForeignKey(to='creation.Language')), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('foss_category', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.FossCategory')), + ('language', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.Language')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'Quality Reviewer Role', @@ -283,8 +284,8 @@ class Migration(migrations.Migration): ('status', models.PositiveSmallIntegerField(default=0)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('approved_user', models.ForeignKey(related_name='approved_user', blank=True, to=settings.AUTH_USER_MODEL, null=True)), - ('user', models.ForeignKey(related_name='user', to=settings.AUTH_USER_MODEL)), + ('approved_user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='approved_user', blank=True, to=settings.AUTH_USER_MODEL, null=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='user', to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -296,7 +297,7 @@ class Migration(migrations.Migration): ('script_writer', models.BooleanField()), ('is_reviewer', models.BooleanField()), ('created', models.DateTimeField(auto_now_add=True)), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -307,9 +308,9 @@ class Migration(migrations.Migration): ('brief_description', models.TextField()), ('example_suggestion', models.BooleanField()), ('created', models.DateTimeField(auto_now_add=True)), - ('difficulty_level', models.ForeignKey(to='creation.Level')), + ('difficulty_level', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.Level')), ('operating_system', models.ManyToManyField(to='creation.OperatingSystem')), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -327,9 +328,9 @@ class Migration(migrations.Migration): ('keyword_status', models.PositiveSmallIntegerField(default=0)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('assignment_user', models.ForeignKey(related_name='assignments', to=settings.AUTH_USER_MODEL)), - ('code_user', models.ForeignKey(related_name='codes', to=settings.AUTH_USER_MODEL)), - ('keyword_user', models.ForeignKey(related_name='keywords', to=settings.AUTH_USER_MODEL)), + ('assignment_user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='assignments', to=settings.AUTH_USER_MODEL)), + ('code_user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='codes', to=settings.AUTH_USER_MODEL)), + ('keyword_user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='keywords', to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'Tutorial Common Content', @@ -343,9 +344,9 @@ class Migration(migrations.Migration): ('order', models.IntegerField()), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('foss', models.ForeignKey(to='creation.FossCategory')), - ('level', models.ForeignKey(to='creation.Level')), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('foss', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.FossCategory')), + ('level', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.Level')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'Tutorial Detail', @@ -371,8 +372,8 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('reply_message', models.TextField()), ('created', models.DateTimeField(auto_now_add=True)), - ('missing_component', models.ForeignKey(to='creation.TutorialMissingComponent')), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('missing_component', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.TutorialMissingComponent')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -394,183 +395,183 @@ class Migration(migrations.Migration): ('hit_count', models.PositiveIntegerField(default=0)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('common_content', models.ForeignKey(to='creation.TutorialCommonContent')), - ('language', models.ForeignKey(to='creation.Language')), - ('outline_user', models.ForeignKey(related_name='outlines', to=settings.AUTH_USER_MODEL)), - ('script_user', models.ForeignKey(related_name='scripts', to=settings.AUTH_USER_MODEL)), - ('tutorial_detail', models.ForeignKey(to='creation.TutorialDetail')), - ('video_user', models.ForeignKey(related_name='videos', to=settings.AUTH_USER_MODEL)), + ('common_content', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.TutorialCommonContent')), + ('language', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.Language')), + ('outline_user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='outlines', to=settings.AUTH_USER_MODEL)), + ('script_user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='scripts', to=settings.AUTH_USER_MODEL)), + ('tutorial_detail', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.TutorialDetail')), + ('video_user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='videos', to=settings.AUTH_USER_MODEL)), ], ), migrations.AddField( model_name='tutorialmissingcomponent', name='tutorial_resource', - field=models.ForeignKey(to='creation.TutorialResource'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.TutorialResource'), ), migrations.AddField( model_name='tutorialmissingcomponent', name='user', - field=models.ForeignKey(related_name='raised_user', blank=True, to=settings.AUTH_USER_MODEL, null=True), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='raised_user', blank=True, to=settings.AUTH_USER_MODEL, null=True), ), migrations.AddField( model_name='tutorialcommoncontent', name='prerequisite', - field=models.ForeignKey(related_name='prerequisite', blank=True, to='creation.TutorialDetail', null=True), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='prerequisite', blank=True, to='creation.TutorialDetail', null=True), ), migrations.AddField( model_name='tutorialcommoncontent', name='prerequisite_user', - field=models.ForeignKey(related_name='prerequisite', to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='prerequisite', to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='tutorialcommoncontent', name='slide_user', - field=models.ForeignKey(related_name='slides', to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='slides', to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='tutorialcommoncontent', name='tutorial_detail', - field=models.OneToOneField(related_name='tutorial_detail', to='creation.TutorialDetail'), + field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='tutorial_detail', to='creation.TutorialDetail'), ), migrations.AddField( model_name='qualityreviewlog', name='tutorial_resource', - field=models.ForeignKey(to='creation.TutorialResource'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.TutorialResource'), ), migrations.AddField( model_name='qualityreviewlog', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='qualityreviewernotification', name='tutorial_resource', - field=models.ForeignKey(to='creation.TutorialResource'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.TutorialResource'), ), migrations.AddField( model_name='qualityreviewernotification', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='publishtutoriallog', name='tutorial_resource', - field=models.ForeignKey(to='creation.TutorialResource'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.TutorialResource'), ), migrations.AddField( model_name='publishtutoriallog', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='publicreviewlog', name='tutorial_resource', - field=models.ForeignKey(to='creation.TutorialResource'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.TutorialResource'), ), migrations.AddField( model_name='publicreviewlog', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='needimprovementlog', name='tutorial_resource', - field=models.ForeignKey(to='creation.TutorialResource'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.TutorialResource'), ), migrations.AddField( model_name='needimprovementlog', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='fossavailableforworkshop', name='foss', - field=models.ForeignKey(to='creation.FossCategory'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.FossCategory'), ), migrations.AddField( model_name='fossavailableforworkshop', name='language', - field=models.ForeignKey(to='creation.Language'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.Language'), ), migrations.AddField( model_name='fossavailablefortest', name='foss', - field=models.ForeignKey(to='creation.FossCategory'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.FossCategory'), ), migrations.AddField( model_name='fossavailablefortest', name='language', - field=models.ForeignKey(to='creation.Language'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.Language'), ), migrations.AddField( model_name='domainreviewlog', name='tutorial_resource', - field=models.ForeignKey(to='creation.TutorialResource'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.TutorialResource'), ), migrations.AddField( model_name='domainreviewlog', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='domainreviewerrole', name='foss_category', - field=models.ForeignKey(to='creation.FossCategory'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.FossCategory'), ), migrations.AddField( model_name='domainreviewerrole', name='language', - field=models.ForeignKey(to='creation.Language'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.Language'), ), migrations.AddField( model_name='domainreviewerrole', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='domainreviewernotification', name='tutorial_resource', - field=models.ForeignKey(to='creation.TutorialResource'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.TutorialResource'), ), migrations.AddField( model_name='domainreviewernotification', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='contributorrole', name='foss_category', - field=models.ForeignKey(to='creation.FossCategory'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.FossCategory'), ), migrations.AddField( model_name='contributorrole', name='language', - field=models.ForeignKey(to='creation.Language'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.Language'), ), migrations.AddField( model_name='contributorrole', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='contributornotification', name='tutorial_resource', - field=models.ForeignKey(to='creation.TutorialResource'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.TutorialResource'), ), migrations.AddField( model_name='contributornotification', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='contributorlog', name='tutorial_resource', - field=models.ForeignKey(to='creation.TutorialResource'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.TutorialResource'), ), migrations.AddField( model_name='contributorlog', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='collaborate', @@ -580,42 +581,42 @@ class Migration(migrations.Migration): migrations.AddField( model_name='collaborate', name='language', - field=models.ForeignKey(to='creation.Language'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.Language'), ), migrations.AddField( model_name='collaborate', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='archivedvideo', name='tutorial_resource', - field=models.ForeignKey(to='creation.TutorialResource'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.TutorialResource'), ), migrations.AddField( model_name='archivedvideo', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='adminreviewlog', name='tutorial_resource', - field=models.ForeignKey(to='creation.TutorialResource'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.TutorialResource'), ), migrations.AddField( model_name='adminreviewlog', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='adminreviewernotification', name='tutorial_resource', - field=models.ForeignKey(to='creation.TutorialResource'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.TutorialResource'), ), migrations.AddField( model_name='adminreviewernotification', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AlterUniqueTogether( name='tutorialresource', diff --git a/creation/migrations/0002_auto_20170107_1845.py b/creation/migrations/0002_auto_20170107_1845.py index 4cb2725c2..593358cce 100644 --- a/creation/migrations/0002_auto_20170107_1845.py +++ b/creation/migrations/0002_auto_20170107_1845.py @@ -4,6 +4,7 @@ # Third Party Stuff from django.conf import settings from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -27,6 +28,6 @@ class Migration(migrations.Migration): migrations.AddField( model_name='tutorialcommoncontent', name='additional_material_user', - field=models.ForeignKey(related_name='additional_material', default=None, to=settings.AUTH_USER_MODEL, null=True), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='additional_material', default=None, to=settings.AUTH_USER_MODEL, null=True), ), ] diff --git a/creation/migrations/0006_auto_20170329_1132.py b/creation/migrations/0006_auto_20170329_1132.py index 1a93408b2..0a9a7d3d4 100644 --- a/creation/migrations/0006_auto_20170329_1132.py +++ b/creation/migrations/0006_auto_20170329_1132.py @@ -3,6 +3,7 @@ # Third Party Stuff from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -36,11 +37,11 @@ class Migration(migrations.Migration): migrations.AddField( model_name='brochuredocument', name='foss_course', - field=models.ForeignKey(to='creation.FossCategory'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.FossCategory'), ), migrations.AddField( model_name='brochuredocument', name='foss_language', - field=models.ForeignKey(to='creation.Language'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.Language'), ), ] diff --git a/creation/migrations/0009_auto_20170612_1543.py b/creation/migrations/0009_auto_20170612_1543.py index 005fde652..a350528b0 100644 --- a/creation/migrations/0009_auto_20170612_1543.py +++ b/creation/migrations/0009_auto_20170612_1543.py @@ -3,6 +3,7 @@ # Third Party Stuff from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -30,7 +31,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='brochurepage', name='brochure', - field=models.ForeignKey(related_name='pages', to='creation.BrochureDocument'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='pages', to='creation.BrochureDocument'), ), migrations.AlterUniqueTogether( name='brochurepage', diff --git a/creation/models.py b/creation/models.py index 80aada2cb..44dac495e 100644 --- a/creation/models.py +++ b/creation/models.py @@ -1,9 +1,6 @@ # Third Party Stuff - -from builtins import object from django.contrib.auth.models import User from django.db import models -from django.utils.encoding import python_2_unicode_compatible import uuid from datetime import timedelta, date @@ -41,7 +38,6 @@ import datetime -@python_2_unicode_compatible class Language(models.Model): name = models.CharField(max_length=255, unique=True) user = models.ForeignKey(User, on_delete=models.PROTECT ) @@ -49,14 +45,13 @@ class Language(models.Model): created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) - class Meta(object): + class Meta: ordering = ('name',) def __str__(self): return self.name -@python_2_unicode_compatible class FossSuperCategory(models.Model): name = models.CharField(max_length=255, unique=True) created = models.DateTimeField(auto_now_add=True) @@ -65,7 +60,7 @@ class FossSuperCategory(models.Model): # Some of the Fosses are part of Recommendation System part_of_recsys = models.BooleanField(max_length=2, default=False) - class Meta(object): + class Meta: verbose_name = 'FOSS Category' verbose_name_plural = 'FOSS Categories' ordering = ('name',) @@ -88,7 +83,6 @@ def __str__(self): return self.name -@python_2_unicode_compatible class FossCategory(models.Model): foss = models.CharField(unique=True, max_length=255) description = models.TextField() @@ -115,7 +109,7 @@ class FossCategory(models.Model): operating_system = models.CharField(max_length=255, null=True, blank=True) download = models.BooleanField(default=False, help_text='If checked, this foss will be available for CD content download') - class Meta(object): + class Meta: verbose_name = 'FOSS' verbose_name_plural = 'FOSSes' ordering = ('foss', ) @@ -132,14 +126,13 @@ class Meta: unique_together = (('fosscategory', 'domain'),) -@python_2_unicode_compatible class BrochureDocument(models.Model): foss_course = models.ForeignKey(FossCategory, on_delete=models.PROTECT ) foss_language = models.ForeignKey(Language, on_delete=models.PROTECT ) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) - class Meta(object): + class Meta: verbose_name = 'FOSS Brochure' verbose_name_plural = 'FOSS Brochures' @@ -152,12 +145,11 @@ class BrochurePage(models.Model): page = models.FileField(upload_to='brochures/') page_no = models.PositiveIntegerField() - class Meta(object): + class Meta: ordering = ('page_no', ) unique_together = (('brochure', 'page_no'),) -@python_2_unicode_compatible class PlaylistInfo(models.Model): foss = models.ForeignKey(FossCategory, on_delete=models.PROTECT ) language = models.ForeignKey(Language, on_delete=models.PROTECT ) @@ -165,7 +157,7 @@ class PlaylistInfo(models.Model): created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) - class Meta(object): + class Meta: verbose_name = 'Playlist Info' unique_together = (('foss', 'language'),) @@ -179,24 +171,22 @@ class PlaylistItem(models.Model): created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) - class Meta(object): + class Meta: verbose_name = 'Playlist Item' unique_together = (('playlist', 'item_id'),) -@python_2_unicode_compatible class Level(models.Model): level = models.CharField(max_length=255) code = models.CharField(max_length=10) - class Meta(object): + class Meta: verbose_name = 'Tutorial Level' def __str__(self): return self.level -@python_2_unicode_compatible class TutorialDetail(models.Model): foss = models.ForeignKey(FossCategory, on_delete=models.PROTECT ) tutorial = models.CharField(max_length=255) @@ -206,7 +196,7 @@ class TutorialDetail(models.Model): created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) - class Meta(object): + class Meta: verbose_name = 'Tutorial Detail' unique_together = (('foss', 'tutorial', 'level'),) @@ -247,7 +237,7 @@ class TutorialCommonContent(models.Model): created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) - class Meta(object): + class Meta: verbose_name = 'Tutorial Common Content' def keyword_as_list(self): @@ -303,7 +293,7 @@ def get_absolute_url(self): class PaymentHonorarium(models.Model): amount = models.DecimalField(default=0, max_digits=7, decimal_places=2) code = models.CharField(max_length=20, editable=False) - initiated_by = models.ForeignKey(User, related_name="initiator",default=7) + initiated_by = models.ForeignKey(User, related_name="initiator", default=7, on_delete=models.PROTECT) status = models.PositiveSmallIntegerField(default=1, choices=HONORARIUM_STATUS) updated = models.DateTimeField(auto_now=True) @@ -323,8 +313,8 @@ def save(self, *args, **kwargs): class TutorialPayment(models.Model): - user = models.ForeignKey(User, related_name="contributor",) - tutorial_resource = models.ForeignKey(TutorialResource) + user = models.ForeignKey(User, related_name="contributor", on_delete=models.PROTECT) + tutorial_resource = models.ForeignKey(TutorialResource, on_delete=models.PROTECT) payment_honorarium = models.ForeignKey('PaymentHonorarium', related_name="tutorials", null=True, blank=True, on_delete=models.SET_NULL) user_type = models.PositiveSmallIntegerField(default=3, choices=USER_TYPE) seconds = models.PositiveIntegerField(default=0, help_text="Tutorial duration in seconds") @@ -386,7 +376,7 @@ class ContributorRole(models.Model): user = models.ForeignKey(User, on_delete=models.PROTECT ) language = models.ForeignKey(Language, on_delete=models.PROTECT ) foss_category = models.ForeignKey(FossCategory, on_delete=models.PROTECT ) - tutorial_detail = models.ForeignKey(TutorialDetail, null=True) + tutorial_detail = models.ForeignKey(TutorialDetail, null=True, on_delete=models.PROTECT) status = models.BooleanField() created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) @@ -395,7 +385,7 @@ def revoke(self): self.status = 0 self.save() - class Meta(object): + class Meta: unique_together = (('user', 'tutorial_detail', 'language',),) verbose_name = 'Contributor Role' @@ -522,7 +512,7 @@ class QualityReviewerNotification(models.Model): class RoleRequest(models.Model): user = models.ForeignKey(User, related_name='user', on_delete=models.PROTECT ) role_type = models.IntegerField(default=0) - language = models.ForeignKey(Language, null=True) + language = models.ForeignKey(Language, null=True, on_delete=models.PROTECT) status = models.PositiveSmallIntegerField(default=0) approved_user = models.ForeignKey( User, related_name='approved_user', null=True, blank=True, on_delete=models.PROTECT ) @@ -544,7 +534,7 @@ class FossAvailableForWorkshop(models.Model): status = models.BooleanField(default=0) created = models.DateTimeField(auto_now_add=True) - class Meta(object): + class Meta: unique_together = (('foss', 'language'),) @@ -554,7 +544,7 @@ class FossAvailableForTest(models.Model): status = models.BooleanField(default=0) created = models.DateTimeField(auto_now_add=True) - class Meta(object): + class Meta: unique_together = (('foss', 'language'),) @@ -579,7 +569,6 @@ class TutorialMissingComponentReply(models.Model): created = models.DateTimeField(auto_now_add=True) -@python_2_unicode_compatible class OperatingSystem(models.Model): name = models.CharField(max_length=255) @@ -587,7 +576,6 @@ def __str__(self): return self.name -@python_2_unicode_compatible class SuggestTopic(models.Model): user = models.ForeignKey(User, on_delete=models.PROTECT ) topic_title = models.CharField(max_length=255) @@ -601,7 +589,6 @@ def __str__(self): return self.topic_title -@python_2_unicode_compatible class SuggestExample(models.Model): user = models.ForeignKey(User, on_delete=models.PROTECT ) topic_title = models.CharField(max_length=255) @@ -614,7 +601,6 @@ def __str__(self): return self.topic_title -@python_2_unicode_compatible class ContributeTowards(models.Model): name = models.CharField(max_length=255) @@ -642,18 +628,18 @@ class Collaborate(models.Model): class ContributorRating(models.Model): - user = models.ForeignKey(User) + user = models.ForeignKey(User, on_delete=models.PROTECT) choices = ((0,0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5)) rating = models.PositiveIntegerField(choices=choices,default=0) - language = models.ForeignKey(Language) + language = models.ForeignKey(Language, on_delete=models.PROTECT) class Meta: unique_together = (('user', 'language'),) class TutorialsAvailable(models.Model): - tutorial_detail = models.ForeignKey(TutorialDetail) - language = models.ForeignKey(Language) + tutorial_detail = models.ForeignKey(TutorialDetail, on_delete=models.PROTECT) + language = models.ForeignKey(Language, on_delete=models.PROTECT) class Meta: unique_together = (('tutorial_detail', 'language'),) @@ -661,8 +647,8 @@ class Meta: class LanguageManager(models.Model): - user = models.ForeignKey(User) - language = models.ForeignKey(Language) + user = models.ForeignKey(User, on_delete=models.PROTECT) + language = models.ForeignKey(Language, on_delete=models.PROTECT) status = models.BooleanField(default=0) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) @@ -685,3 +671,4 @@ class TutorialSummaryCache(models.Model): def __str__(self): return f"FOSS {self.foss_id}: {self.tutorial_count} tutorials" + diff --git a/creation/templatetags/creationdata.py b/creation/templatetags/creationdata.py index 4e900ca37..cf8cb5f93 100644 --- a/creation/templatetags/creationdata.py +++ b/creation/templatetags/creationdata.py @@ -79,8 +79,13 @@ def get_payment_status_symbol(key): return status_list[key] def get_username(key): - user = User.objects.get(pk = key) - return user.username + if not key: + return '-' + try: + user = User.objects.get(pk=key) + return user.username + except Exception: + return '-' def get_last_video_upload_time(key): rec = None @@ -110,10 +115,17 @@ def get_component_name(comp): return key.title() def get_missing_component_reply(mcid): - rows = TutorialMissingComponentReply.objects.filter(missing_component_id = mcid) + rows = TutorialMissingComponentReply.objects.filter(missing_component_id=mcid).select_related('user') replies = '' for row in rows: - replies += '

' + row.reply_message + ' -' + row.user.username + '

' + username = '' + try: + if row.user: + username = row.user.username + except Exception: + username = 'Unknown' + username_str = ' -' + username + '' if username else '' + replies += '

' + row.reply_message + username_str + '

' if replies: replies = '
Replies:' + replies return replies diff --git a/creation/test_creation.py b/creation/test_creation.py index 78b46d603..21cf0c901 100644 --- a/creation/test_creation.py +++ b/creation/test_creation.py @@ -1,7 +1,7 @@ import os from django.test import TestCase -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth.models import User, Group from .models import TutorialPayment diff --git a/creation/urls.py b/creation/urls.py index 829a0c440..d920452f9 100644 --- a/creation/urls.py +++ b/creation/urls.py @@ -1,5 +1,5 @@ # Third Party Stuff -from django.conf.urls import include, url +from django.urls import include, re_path from creation.views import * from creation.script import * from django.contrib.sitemaps.views import sitemap @@ -13,131 +13,131 @@ urlpatterns = [ # Main pages dispatcher - url(r'^$', creationhome, name="creationhome"), + re_path(r'^$', creationhome, name="creationhome"), # Contributor part - url(r'^upload/$', upload_index, name="upload_index"), - url(r'^upload/tutorial/(\d+)/$', upload_tutorial, name="upload_tutorial"), - url(r'^upload/outline/(\d+)/$', upload_outline, name="upload_outline"), - url(r'^upload/script/(\d+)/$', upload_script, name="upload_script"), - url(r'^upload/timed-script/$', upload_timed_script, name="upload_timed_script"), - url(r'^upload/timed-script/(\d+)/save/$', save_timed_script, name="save_timed_script"), - url(r'^upload/keywords/(\d+)/$', upload_keywords, name="upload_keywords"), - url(r'^upload/prerequisite/(\d+)/$', upload_prerequisite, name="upload_prerequisite"), - url(r'^upload/component/(\d+)/(\w+)/$', upload_component, name="upload_component"), - url(r'^mark/notrequired/(\d+)/(\d+)/(\w+)/$', mark_notrequired, name="mark_notrequired"), - url(r'^view/component/(\d+)/(\w+)/$', view_component, name="view_component"), - url(r'^upload/needimprovement/$', tutorials_needimprovement, name="tutorials_needimprovement"), - url(r'^upload/contributed/$', tutorials_contributed, name="tutorials_contributed"), - url(r'^upload/pending-tutorials/$', tutorials_pending, name="tutorials_pending"), - url(r'^upload-publish-outline/$', upload_publish_outline, name="upload_publish_outline"), - url(r'^list-missing-script/$', list_missing_script, name="list_missing_script"), - url(r'^ajax-upload-foss/$', ajax_upload_foss, name="ajax_upload_foss"), - url(r'^ajax-upload-prerequisite/$', ajax_upload_prerequisite, name="ajax_upload_prerequisite"), - url(r'^ajax-upload-timed-script/$', ajax_upload_timed_script, name="ajax_upload_timed_script"), - url(r'^ajax-get-keywords/$', ajax_get_keywords, name="ajax_get_keywords"), - url(r'^view_brochure/$', view_brochure, name="view_brochure"), + re_path(r'^upload/$', upload_index, name="upload_index"), + re_path(r'^upload/tutorial/(\d+)/$', upload_tutorial, name="upload_tutorial"), + re_path(r'^upload/outline/(\d+)/$', upload_outline, name="upload_outline"), + re_path(r'^upload/script/(\d+)/$', upload_script, name="upload_script"), + re_path(r'^upload/timed-script/$', upload_timed_script, name="upload_timed_script"), + re_path(r'^upload/timed-script/(\d+)/save/$', save_timed_script, name="save_timed_script"), + re_path(r'^upload/keywords/(\d+)/$', upload_keywords, name="upload_keywords"), + re_path(r'^upload/prerequisite/(\d+)/$', upload_prerequisite, name="upload_prerequisite"), + re_path(r'^upload/component/(\d+)/(\w+)/$', upload_component, name="upload_component"), + re_path(r'^mark/notrequired/(\d+)/(\d+)/(\w+)/$', mark_notrequired, name="mark_notrequired"), + re_path(r'^view/component/(\d+)/(\w+)/$', view_component, name="view_component"), + re_path(r'^upload/needimprovement/$', tutorials_needimprovement, name="tutorials_needimprovement"), + re_path(r'^upload/contributed/$', tutorials_contributed, name="tutorials_contributed"), + re_path(r'^upload/pending-tutorials/$', tutorials_pending, name="tutorials_pending"), + re_path(r'^upload-publish-outline/$', upload_publish_outline, name="upload_publish_outline"), + re_path(r'^list-missing-script/$', list_missing_script, name="list_missing_script"), + re_path(r'^ajax-upload-foss/$', ajax_upload_foss, name="ajax_upload_foss"), + re_path(r'^ajax-upload-prerequisite/$', ajax_upload_prerequisite, name="ajax_upload_prerequisite"), + re_path(r'^ajax-upload-timed-script/$', ajax_upload_timed_script, name="ajax_upload_timed_script"), + re_path(r'^ajax-get-keywords/$', ajax_get_keywords, name="ajax_get_keywords"), + re_path(r'^view_brochure/$', view_brochure, name="view_brochure"), # Admin Reviewer part - url(r'^admin-review/$', admin_review_index, name="admin_review_index"), - url(r'^admin-review/reviewed/$', admin_reviewed_video, name="admin_reviewed_video"), - url(r'^admin-review/video/(\d+)/$', admin_review_video, name="admin_review_video"), + re_path(r'^admin-review/$', admin_review_index, name="admin_review_index"), + re_path(r'^admin-review/reviewed/$', admin_reviewed_video, name="admin_reviewed_video"), + re_path(r'^admin-review/video/(\d+)/$', admin_review_video, name="admin_review_video"), # Domain Reviewer part - url(r'^domain-review/$', domain_review_index, name="domain_review_index"), - url(r'^domain-review/reviewed/$', domain_reviewed_tutorials, name="domain_reviewed_tutorials"), - url(r'^domain-review/tutorial/(\d+)/$', domain_review_tutorial, name="domain_review_tutorial"), - url(r'^domain-review/component/(\d+)/(\w+)/$', domain_review_component, name="domain_review_component"), + re_path(r'^domain-review/$', domain_review_index, name="domain_review_index"), + re_path(r'^domain-review/reviewed/$', domain_reviewed_tutorials, name="domain_reviewed_tutorials"), + re_path(r'^domain-review/tutorial/(\d+)/$', domain_review_tutorial, name="domain_review_tutorial"), + re_path(r'^domain-review/component/(\d+)/(\w+)/$', domain_review_component, name="domain_review_component"), # Quality Reviewer part - url(r'^quality-review/$', quality_review_index, name="quality_review_index"), - url(r'^quality-review/(\d+)/$', quality_review_index, name="quality_review_index"), - url(r'^quality-review/reviewed/$', quality_reviewed_tutorials, name="quality_reviewed_tutorials"), - url(r'^quality-review/tutorial/(\d+)/$', quality_review_tutorial, name="quality_review_tutorial"), - url(r'^quality-review/tutorial/publish/index/$', publish_tutorial_index, name="publish_tutorial_index"), - url(r'^quality-review/tutorial/publish/(\d+)/$', publish_tutorial, name="publish_tutorial"), - url(r'^quality-review/component/(\d+)/(\w+)/$', quality_review_component, name="quality_review_component"), - url(r'^public-review/tutorial/index/$', public_review_tutorial_index, name="public_review_tutorial_index"), - url(r'^public-review/tutorial/(\d+)/$', public_review_tutorial, name="public_review_tutorial"), - url(r'^public-review/publish/(\d+)/$', public_review_publish, name="public_review_publish"), - url(r'^public-review/mark-as-pending/(\d+)/$', public_review_mark_as_pending, name="public_review_mark_as_pending"), - url(r'^public-review/list/$', public_review_list, name="public_review_list"), + re_path(r'^quality-review/$', quality_review_index, name="quality_review_index"), + re_path(r'^quality-review/(\d+)/$', quality_review_index, name="quality_review_index"), + re_path(r'^quality-review/reviewed/$', quality_reviewed_tutorials, name="quality_reviewed_tutorials"), + re_path(r'^quality-review/tutorial/(\d+)/$', quality_review_tutorial, name="quality_review_tutorial"), + re_path(r'^quality-review/tutorial/publish/index/$', publish_tutorial_index, name="publish_tutorial_index"), + re_path(r'^quality-review/tutorial/publish/(\d+)/$', publish_tutorial, name="publish_tutorial"), + re_path(r'^quality-review/component/(\d+)/(\w+)/$', quality_review_component, name="quality_review_component"), + re_path(r'^public-review/tutorial/index/$', public_review_tutorial_index, name="public_review_tutorial_index"), + re_path(r'^public-review/tutorial/(\d+)/$', public_review_tutorial, name="public_review_tutorial"), + re_path(r'^public-review/publish/(\d+)/$', public_review_publish, name="public_review_publish"), + re_path(r'^public-review/mark-as-pending/(\d+)/$', public_review_mark_as_pending, name="public_review_mark_as_pending"), + re_path(r'^public-review/list/$', public_review_list, name="public_review_list"), # Administrator part - url(r'^role/requests/$', creation_list_role_requests, name="creation_list_role_requests"), - url(r'^role/lang_requests/$', creation_lang_list_role_requests, name="creation_lang_list_role_requests"), - url(r'^update-prerequisite/$', update_prerequisite, name="update_prerequisite"), - url(r'^update-keywords/$', update_keywords, name="update_keywords"), - url(r'^update-manual/(\w+)/$', update_sheet, name="update_sheet"), - url(r'^update-assignment/$', update_assignment, name="update_assignment"), - url(r'^update-thumbnail/$', update_thumbnail, name="update_thumbnail"), - url(r'^update-codefiles/$', update_codefiles, name="update_codefiles"), - url(r'^role/requests/([a-zA-Z-]+)/$', creation_list_role_requests, name="creation_list_role_requests"), - url(r'^role/lang_requests/([a-zA-Z-]+)/$', creation_lang_list_role_requests, name="creation_lang_list_role_requests"), - url(r'^role/accept/(?P\d+)/(?P\w+)/$', creation_accept_role_request, name="creation_accept_role_request"), - url(r'^role/reject/(?P\d+)/(?P\w+)/$', creation_reject_role_request, name="creation_reject_role_request"), - url(r'^role/revoke/([a-zA-Z-]+)/([0-9/]+)/$', creation_revoke_role_request, name="creation_revoke_role_request"), - url(r'^admin/tutorial/status/pending/$', creation_change_published_to_pending, name="creation_change_published_to_pending"), - url(r'^admin/tutorial/component/status/$', creation_change_component_status, name="creation_change_component_status"), - url(r'^ajax-publish-to-pending/$', ajax_publish_to_pending, name="ajax_publish_to_pending"), - url(r'^ajax-change-component-status/$', ajax_change_component_status, name="ajax_change_component_status"), - url(r'^ajax-manual-language/$', ajax_manual_language, name="ajax_manual_language"), - url(r'^ajax-get-tutorials/$', ajax_get_tutorials, name="ajax_get_tutorials"), - url(r'^update-common-component/$', update_common_component, name="update_common_component"), - url(r'^update_tutorials/$', update_tutorials, name="update_tutorials"), - url(r'^grant_role/$', grant_role, name="grant_role"), + re_path(r'^role/requests/$', creation_list_role_requests, name="creation_list_role_requests"), + re_path(r'^role/lang_requests/$', creation_lang_list_role_requests, name="creation_lang_list_role_requests"), + re_path(r'^update-prerequisite/$', update_prerequisite, name="update_prerequisite"), + re_path(r'^update-keywords/$', update_keywords, name="update_keywords"), + re_path(r'^update-manual/(\w+)/$', update_sheet, name="update_sheet"), + re_path(r'^update-assignment/$', update_assignment, name="update_assignment"), + re_path(r'^update-thumbnail/$', update_thumbnail, name="update_thumbnail"), + re_path(r'^update-codefiles/$', update_codefiles, name="update_codefiles"), + re_path(r'^role/requests/([a-zA-Z-]+)/$', creation_list_role_requests, name="creation_list_role_requests"), + re_path(r'^role/lang_requests/([a-zA-Z-]+)/$', creation_lang_list_role_requests, name="creation_lang_list_role_requests"), + re_path(r'^role/accept/(?P\d+)/(?P\w+)/$', creation_accept_role_request, name="creation_accept_role_request"), + re_path(r'^role/reject/(?P\d+)/(?P\w+)/$', creation_reject_role_request, name="creation_reject_role_request"), + re_path(r'^role/revoke/([a-zA-Z-]+)/([0-9/]+)/$', creation_revoke_role_request, name="creation_revoke_role_request"), + re_path(r'^admin/tutorial/status/pending/$', creation_change_published_to_pending, name="creation_change_published_to_pending"), + re_path(r'^admin/tutorial/component/status/$', creation_change_component_status, name="creation_change_component_status"), + re_path(r'^ajax-publish-to-pending/$', ajax_publish_to_pending, name="ajax_publish_to_pending"), + re_path(r'^ajax-change-component-status/$', ajax_change_component_status, name="ajax_change_component_status"), + re_path(r'^ajax-manual-language/$', ajax_manual_language, name="ajax_manual_language"), + re_path(r'^ajax-get-tutorials/$', ajax_get_tutorials, name="ajax_get_tutorials"), + re_path(r'^update-common-component/$', update_common_component, name="update_common_component"), + re_path(r'^update_tutorials/$', update_tutorials, name="update_tutorials"), + re_path(r'^grant_role/$', grant_role, name="grant_role"), # Common to Domain & Admin reviewer parts - url(r'^accept-all/(\w+)/(\d+)/$', accept_all, name="accept_all"), - url(r'^delete-notification/(\w+)/(\d+)/$', delete_creation_notification, name="delete_creation_notification"), - url(r'^clear-notifications/(\w+)/$', clear_creation_notification, name="clear_creation_notification"), - url(r'^tutorial/view/([0-9a-zA-Z-+%\(\).,\']+)/([0-9a-zA-Z-+%\(\).,\']+)/([a-zA-Z-]+)/$', creation_view_tutorial, name="creation_view_tutorial"), - url(r'^init/$', init_creation_app, name="init_creation_app"), - url(r'^role/add/([a-zA-Z-]+)/([0-9/]+)/$', creation_add_role, name="creation_add_role"), - url(r'^collaborate/$', collaborate, name="collaborate"), - url(r'^suggest-a-topic/$', suggest_topic, name="suggest_topic"), - url(r'^suggest-an-example/$', suggest_example, name="suggest_example"), - url(r'^report-missing-component/(\d+)/$', report_missing_component, name="report_missing_component"), - url(r'^report-missing-component/reply/(\d+)/$', report_missing_component_reply, name="report_missing_component_reply"), - url(r'^report-missing-component/list/$', report_missing_component_list, name="report_missing_component_list"), + re_path(r'^accept-all/(\w+)/(\d+)/$', accept_all, name="accept_all"), + re_path(r'^delete-notification/(\w+)/(\d+)/$', delete_creation_notification, name="delete_creation_notification"), + re_path(r'^clear-notifications/(\w+)/$', clear_creation_notification, name="clear_creation_notification"), + re_path(r'^tutorial/view/([0-9a-zA-Z-+%\(\).,\']+)/([0-9a-zA-Z-+%\(\).,\']+)/([a-zA-Z-]+)/$', creation_view_tutorial, name="creation_view_tutorial"), + re_path(r'^init/$', init_creation_app, name="init_creation_app"), + re_path(r'^role/add/([a-zA-Z-]+)/([0-9/]+)/$', creation_add_role, name="creation_add_role"), + re_path(r'^collaborate/$', collaborate, name="collaborate"), + re_path(r'^suggest-a-topic/$', suggest_topic, name="suggest_topic"), + re_path(r'^suggest-an-example/$', suggest_example, name="suggest_example"), + re_path(r'^report-missing-component/(\d+)/$', report_missing_component, name="report_missing_component"), + re_path(r'^report-missing-component/reply/(\d+)/$', report_missing_component_reply, name="report_missing_component_reply"), + re_path(r'^report-missing-component/list/$', report_missing_component_list, name="report_missing_component_list"), # Additional Views Created for Payment Module - url(r'payment/tutorials/$', list_all_published_tutorials, name="list_all_published_tutorials"), - url(r'payment/ajax/languages/$', load_languages, name="load_languages"), - url(r'payment/ajax/fosses/$', load_fosses, name="load_fosses"), - url(r'payment/due/$', list_all_due_tutorials, name="payment_due_tutorials"), - url(r'payment/honorarium/$', list_payment_honorarium, name="payment_honorarium_list"), - url(r'payment/honorarium/detail/(\d+)/$', detail_payment_honorarium, name="payment_honorarium_detail"), - url(r'hono_agreement/(?P\d+)/',honorarium_agreement,name='honorarium_agreement'), - url(r'honorarium/(?P\d+)/',honorarium,name='honorarium'), - url(r'hono_receipt/(?P\d+)/',honorarium_receipt,name='honorarium_receipt'), - url(r'add_details/',add_details,name='add_details'), - url(r'save_details/',save_details,name='save_details'), - url(r'file_checker/(?P[\w]+)/(?P[-\w]+)',file_checker,name='file_checker'), + re_path(r'payment/tutorials/$', list_all_published_tutorials, name="list_all_published_tutorials"), + re_path(r'payment/ajax/languages/$', load_languages, name="load_languages"), + re_path(r'payment/ajax/fosses/$', load_fosses, name="load_fosses"), + re_path(r'payment/due/$', list_all_due_tutorials, name="payment_due_tutorials"), + re_path(r'payment/honorarium/$', list_payment_honorarium, name="payment_honorarium_list"), + re_path(r'payment/honorarium/detail/(\d+)/$', detail_payment_honorarium, name="payment_honorarium_detail"), + re_path(r'hono_agreement/(?P\d+)/',honorarium_agreement,name='honorarium_agreement'), + re_path(r'honorarium/(?P\d+)/',honorarium,name='honorarium'), + re_path(r'hono_receipt/(?P\d+)/',honorarium_receipt,name='honorarium_receipt'), + re_path(r'add_details/',add_details,name='add_details'), + re_path(r'save_details/',save_details,name='save_details'), + re_path(r'file_checker/(?P[\w]+)/(?P[-\w]+)',file_checker,name='file_checker'), #Bidding Module - url(r'^rate_contributors/$',rate_contributors,name = "rate_contributors"), - url(r'^add_contributorrating',add_contributorrating,name = "add_contributorrating"), - url(r'^allocate_tutorial/(?P\w+)/(?P\w+)/$', allocate_tutorial, name="allocate_tutorial"), - url(r'^allocate_tutorial_manager/(?P\w+)/(?P\w+)/$', allocate_tutorial, name="allocate_tutorial_manager"), - #url(r'^refresh_tutorials/$',refresh_tutorials,name = "refresh_tutorials"), - #url(r'^revoke_allocated_tutorial/(?P\w+)/(?P\w+)/(?P\w+)/(?P\w+)/(?P\w+)/$', revoke_allocated_tutorial, name="revoke_allocated_tutorial"), - url(r'^revoke_allocated_tutorial/$', revoke_allocated_tutorial, name="revoke_allocated_tutorial"), - url(r'^extend_submission_date/$', extend_submission_date, name="extend_submission_date"), - url(r'^allocate/(?P\d+)/(?P\d+)/(?P\d+)/(?P\d+)/$', allocate, name="allocate"), - url(r'^allocate_foss/(?P\d+)/(?P\w+)/(?P\d+)/(?P\w+)/(?P\d+)/$', allocate_foss, name="allocate_foss"), - url(r'^get_languages/(?P\w+)$', get_languages, name="get_languages"), - url(r'^get_tutorials/(?P\w+)/(?P\w+)$', get_tutorials, name="get_tutorials"), - url(r'^get_other_languages/(?P\w+)$', get_other_languages, name="get_other_languages"), - url(r'^get_domain_languages/(?P\w+)$', get_domain_languages, name="get_domain_languages"), - url(r'^get_quality_languages/(?P\w+)$', get_quality_languages, name="get_quality_languages"), - url(r'^refresh_roles/$', refresh_roles, name="refresh_roles"), - url(r'^get_rated_contributors/$', get_rated_contributors, name="get_rated_contributors"), - url(r'^update_contributors/$', update_contributors, name="update_contributors"), + re_path(r'^rate_contributors/$',rate_contributors,name = "rate_contributors"), + re_path(r'^add_contributorrating',add_contributorrating,name = "add_contributorrating"), + re_path(r'^allocate_tutorial/(?P\w+)/(?P\w+)/$', allocate_tutorial, name="allocate_tutorial"), + re_path(r'^allocate_tutorial_manager/(?P\w+)/(?P\w+)/$', allocate_tutorial, name="allocate_tutorial_manager"), + #re_path(r'^refresh_tutorials/$',refresh_tutorials,name = "refresh_tutorials"), + #re_path(r'^revoke_allocated_tutorial/(?P\w+)/(?P\w+)/(?P\w+)/(?P\w+)/(?P\w+)/$', revoke_allocated_tutorial, name="revoke_allocated_tutorial"), + re_path(r'^revoke_allocated_tutorial/$', revoke_allocated_tutorial, name="revoke_allocated_tutorial"), + re_path(r'^extend_submission_date/$', extend_submission_date, name="extend_submission_date"), + re_path(r'^allocate/(?P\d+)/(?P\d+)/(?P\d+)/(?P\d+)/$', allocate, name="allocate"), + re_path(r'^allocate_foss/(?P\d+)/(?P\w+)/(?P\d+)/(?P\w+)/(?P\d+)/$', allocate_foss, name="allocate_foss"), + re_path(r'^get_languages/(?P\w+)$', get_languages, name="get_languages"), + re_path(r'^get_tutorials/(?P\w+)/(?P\w+)$', get_tutorials, name="get_tutorials"), + re_path(r'^get_other_languages/(?P\w+)$', get_other_languages, name="get_other_languages"), + re_path(r'^get_domain_languages/(?P\w+)$', get_domain_languages, name="get_domain_languages"), + re_path(r'^get_quality_languages/(?P\w+)$', get_quality_languages, name="get_quality_languages"), + re_path(r'^refresh_roles/$', refresh_roles, name="refresh_roles"), + re_path(r'^get_rated_contributors/$', get_rated_contributors, name="get_rated_contributors"), + re_path(r'^update_contributors/$', update_contributors, name="update_contributors"), #creation sitemaps - url(r'^sitemap\.xml/$', sitemap, {'sitemaps' : tutorial_sitemaps } , name='tutorial_sitemap'), + re_path(r'^sitemap\.xml/$', sitemap, {'sitemaps' : tutorial_sitemaps } , name='tutorial_sitemap'), ] diff --git a/creation/views.py b/creation/views.py index ec19f88e0..96e792e5e 100644 --- a/creation/views.py +++ b/creation/views.py @@ -31,13 +31,13 @@ from django.core.exceptions import PermissionDenied from django.core.mail import EmailMultiAlternatives from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator -from django.http import HttpResponse, HttpResponseRedirect, Http404 +from django.http import HttpResponse, HttpResponseRedirect, Http404, JsonResponse from django.views.decorators.csrf import csrf_exempt,csrf_protect from django.template.context_processors import csrf from django.shortcuts import render,redirect from django.db.models import Count, F, Q from django.views.generic.list import ListView -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db import IntegrityError # Spoken Tutorial Stuff @@ -55,7 +55,6 @@ from django.contrib.auth.models import User import itertools from django.utils.html import format_html -from django.core.urlresolvers import reverse def humansize(nbytes): suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'] @@ -182,24 +181,26 @@ def get_video_info(path): return info_m #create_thumbnail(tr_rec, 'Big', tr_rec.video_thumbnail_time, '700:500') def create_thumbnail(row, attach_str, thumb_time, thumb_size): - filepath = settings.MEDIA_ROOT + 'videos/' + str(row.tutorial_detail.foss_id) + '/' + str(row.tutorial_detail_id) + '/' + folder_path = os.path.join(settings.MEDIA_ROOT, 'videos', str(row.tutorial_detail.foss_id), str(row.tutorial_detail_id)) + os.makedirs(folder_path, exist_ok=True) filename = row.tutorial_detail.tutorial.replace(' ', '-') + '-' + attach_str + '.png' + output_filepath = os.path.join(folder_path, filename) + video_path = os.path.join(folder_path, str(row.video or '')) logger.info("Thumbnail generation selected timestamp: %s", thumb_time) try: - cmd = ['/usr/bin/ffmpeg', '-nostdin', '-hide_banner', '-nostats', '-y', '-i', filepath + row.video, '-r', str(30), '-ss', str(thumb_time), '-s', thumb_size, '-vframes', str(1), '-f', 'image2', filepath + filename] + if not os.path.exists(video_path): + logger.warning("Video path %s does not exist for thumbnail generation", video_path) + return + cmd = ['/usr/bin/ffmpeg', '-nostdin', '-hide_banner', '-nostats', '-y', '-i', video_path, '-r', str(30), '-ss', str(thumb_time), '-s', thumb_size, '-vframes', str(1), '-f', 'image2', output_filepath] logger.info("Thumbnail generation ffmpeg command: %s", " ".join(cmd)) #process = subprocess.Popen(['/usr/bin/ffmpeg', '-i ' + filepath + row.video + ' -r ' + str(30) + ' -ss ' + str(thumb_time) + ' -s ' + thumb_size + ' -vframes ' + str(1) + ' -f ' + 'image2 ' + filepath + filename], stdout = subprocess.PIPE, stderr = subprocess.STDOUT) - process = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.STDOUT, start_new_session=True) + process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, start_new_session=True) stdout, stderr = process.communicate() logger.info("Thumbnail generation return code: %s", process.returncode) - logger.info("Thumbnail generation stdout: %s", stdout) - logger.info("Thumbnail generation stderr: %s", stderr) - if stderr: - print((filepath + filename)) - print(stderr) + if process.returncode != 0: + logger.warning("Thumbnail generation ffmpeg failed: %s", stdout) except Exception as e: logger.error("Exception in create_thumbnail: type=%s, message=%s\n%s", type(e).__name__, str(e), traceback.format_exc()) - pass def add_qualityreviewer_notification(tr_rec, comp_title, message): dr_roles = QualityReviewerRole.objects.filter(foss_category = tr_rec.tutorial_detail.foss, language = tr_rec.language, status = 1) @@ -309,69 +310,82 @@ def creation_add_role(request, role_type,languages): @login_required def creation_accept_role_request(request, recid, user_type): - if is_administrator: - roles = { - 0: 'Contributor', - 1: 'External-Contributor', - 2: 'Video-Reviewer', - 3: 'Domain-Reviewer', - 4: 'Quality-Reviewer', - } - try: - role_rec = RoleRequest.objects.get(pk = recid, status = STATUS_DICT['inactive']) - if role_rec.role_type in roles: - try: - role_rec.user.groups.add(Group.objects.get(name = roles[role_rec.role_type])) - role_rec.approved_user = request.user - role_rec.status = 1 - role_rec.save() - if role_rec.role_type == ROLES_DICT['video-reviewer']: - messages.success(request, roles[role_rec.role_type] +' role is added to '+role_rec.user.username) - add_creation_notification(request, role_rec.role_type, role_rec.user_id , role_rec.language) - else: - messages.success(request, roles[role_rec.role_type] +' role is added to ' + role_rec.user.username + ' for the language '+role_rec.language.name) - add_creation_notification(request, role_rec.role_type, role_rec.user_id , role_rec.language) - if int(role_rec.role_type) in (ROLES_DICT['contributor'],ROLES_DICT['external-contributor']): - print("Okay 1 ",role_rec.role_type) - add_contributorrating(role_rec) - except Exception as e: - print (e) - messages.error(request, role_rec.user.username + ' is already having ' + roles[role_rec.role_type] + ' role or Language field is not present') - else: - messages.error(request, 'Invalid role argument!') - except: - messages.error(request, 'The given role request id is either invalid or it is already accepted') - else: + if not (is_administrator(request.user) or (user_type == 'lang_manager' and is_language_manager(request.user))): raise PermissionDenied() + roles = { + 0: 'Contributor', + 1: 'External-Contributor', + 2: 'Video-Reviewer', + 3: 'Domain-Reviewer', + 4: 'Quality-Reviewer', + } + role_slug = 'contributor' + try: + role_rec = RoleRequest.objects.get(pk=recid, status=STATUS_DICT['inactive']) + if role_rec.role_type in roles: + role_slug = roles[role_rec.role_type].lower() + try: + group_name = roles[role_rec.role_type] + group_obj, _ = Group.objects.get_or_create(name=group_name) + role_rec.user.groups.add(group_obj) + role_rec.approved_user = request.user + role_rec.status = 1 + role_rec.save() + if role_rec.role_type == ROLES_DICT['video-reviewer']: + messages.success(request, group_name + ' role is added to ' + role_rec.user.username) + add_creation_notification(request, role_rec.role_type, role_rec.user_id, role_rec.language) + else: + lang_name = role_rec.language.name if role_rec.language else '' + messages.success(request, group_name + ' role is added to ' + role_rec.user.username + ' for the language ' + lang_name) + add_creation_notification(request, role_rec.role_type, role_rec.user_id, role_rec.language) + if int(role_rec.role_type) in (ROLES_DICT['contributor'], ROLES_DICT['external-contributor']): + add_contributorrating(role_rec) + except Exception as e: + logger.error("Error adding role to user: %s", e) + messages.error(request, role_rec.user.username + ' is already having ' + roles[role_rec.role_type] + ' role or Language field is not present') + else: + messages.error(request, 'Invalid role argument!') + except RoleRequest.DoesNotExist: + messages.error(request, 'The given role request id is either invalid or it is already accepted') + except Exception as e: + logger.error("Error in creation_accept_role_request: %s", e) + messages.error(request, str(e)) + if user_type == 'lang_manager': - return HttpResponseRedirect('/creation/role/lang_requests/' + roles[role_rec.role_type].lower() + '/') + return HttpResponseRedirect('/creation/role/lang_requests/' + role_slug + '/') else: - return HttpResponseRedirect('/creation/role/requests/' + roles[role_rec.role_type].lower() + '/') + return HttpResponseRedirect('/creation/role/requests/' + role_slug + '/') @login_required def creation_reject_role_request(request, recid, user_type): - if is_administrator: - roles = { - 0: 'Contributor', - 1: 'External-Contributor', - 2: 'Video-Reviewer', - 3: 'Domain-Reviewer', - 4: 'Quality-Reviewer', - } - try: - role_rec = RoleRequest.objects.get(pk = recid, status = 0) - role_rec.delete() - messages.success(request, roles[role_rec.role_type]+ - ' role of '+ str(role_rec.language) + - ' has been deleted successfully for '+role_rec.user.username) - except: - messages.error(request, 'The given role request id is either invalid or it is already rejected') - else: + if not (is_administrator(request.user) or (user_type == 'lang_manager' and is_language_manager(request.user))): raise PermissionDenied() + roles = { + 0: 'Contributor', + 1: 'External-Contributor', + 2: 'Video-Reviewer', + 3: 'Domain-Reviewer', + 4: 'Quality-Reviewer', + } + role_slug = 'contributor' + try: + role_rec = RoleRequest.objects.get(pk=recid, status=0) + role_slug = roles.get(role_rec.role_type, 'contributor').lower() + role_name = roles.get(role_rec.role_type, 'Role') + lang_str = str(role_rec.language) if role_rec.language else '' + username = role_rec.user.username + role_rec.delete() + messages.success(request, role_name + ' role of ' + lang_str + ' has been deleted successfully for ' + username) + except RoleRequest.DoesNotExist: + messages.error(request, 'The given role request id is either invalid or it is already rejected') + except Exception as e: + logger.error("Error in creation_reject_role_request: %s", e) + messages.error(request, str(e)) + if user_type == 'lang_manager': - return HttpResponseRedirect('/creation/role/lang_requests/' + roles[role_rec.role_type].lower() + '/') + return HttpResponseRedirect('/creation/role/lang_requests/' + role_slug + '/') else: - return HttpResponseRedirect('/creation/role/requests/' + roles[role_rec.role_type].lower() + '/') + return HttpResponseRedirect('/creation/role/requests/' + role_slug + '/') @login_required def creation_revoke_role_request(request, role_type,languages): @@ -437,7 +451,7 @@ def creation_revoke_role_request(request, role_type,languages): @login_required def creation_list_role_requests(request, tabid = 'contributor'): - if is_administrator: + if is_administrator(request.user): contrib_recs = RoleRequest.objects.filter(role_type = 0, status = 0).order_by('-updated') ext_contrib_recs = RoleRequest.objects.filter(role_type = 1, status = 0).order_by('-updated') admin_recs = RoleRequest.objects.filter(role_type = 2, status = 0).order_by('-updated') @@ -457,7 +471,7 @@ def creation_list_role_requests(request, tabid = 'contributor'): @login_required def creation_lang_list_role_requests(request, tabid = 'contributor'): - if is_language_manager: + if is_language_manager(request.user): language_manager_langs = LanguageManager.objects.filter( user_id= request.user.id).values_list('language_id') contrib_recs = RoleRequest.objects.filter(role_type = 0, @@ -693,27 +707,26 @@ def upload_publish_outline(request): def ajax_upload_prerequisite(request): data = '' if request.method == 'POST': - foss = '' - try: - foss = int(request.POST.get('foss')) - lang_rec = Language.objects.get(name = 'English') - except: - foss = '' - if foss and lang_rec: - td_list = TutorialDetail.objects.filter(foss_id = foss).values_list('id') - td_recs = TutorialDetail.objects.filter( - id__in = TutorialResource.objects.filter( - tutorial_detail_id__in = td_list, - language_id = lang_rec.id, - ).values_list( - 'tutorial_detail_id' - ) - ).order_by('tutorial') - for td_rec in td_recs: - data += '' - if data: - data = '' + data - return HttpResponse(json.dumps(data), content_type = 'application/json') + foss = request.POST.get('foss', '') + if foss: + try: + foss_id = int(foss) + lang_rec = Language.objects.filter(name='English').first() + if lang_rec: + td_list = TutorialDetail.objects.filter(foss_id=foss_id).values_list('id') + td_recs = TutorialDetail.objects.filter( + id__in=TutorialResource.objects.filter( + tutorial_detail_id__in=td_list, + language_id=lang_rec.id, + ).values_list('tutorial_detail_id') + ).order_by('tutorial') + for td_rec in td_recs: + data += '' + if data: + data = '' + data + except Exception as e: + logger.error("Error in ajax_upload_prerequisite: %s", e) + return JsonResponse(data, safe=False) @csrf_exempt def ajax_upload_foss(request): @@ -801,7 +814,7 @@ def ajax_upload_foss(request): if data: data = '' + data - return HttpResponse(json.dumps(data), content_type = 'application/json') + return JsonResponse(data, safe=False) @csrf_exempt def ajax_get_keywords(request): @@ -809,11 +822,11 @@ def ajax_get_keywords(request): if request.method == 'POST': try: tutorial_detail_id = int(request.POST.get('tutorial_detail')) - tcc = TutorialCommonContent.objects.get(tutorial_detail_id = tutorial_detail_id) - data = tcc.keyword + tcc = TutorialCommonContent.objects.get(tutorial_detail_id=tutorial_detail_id) + data = tcc.keyword or '' except Exception as e: - pass - return HttpResponse(json.dumps(data), content_type = 'application/json') + logger.error("Error in ajax_get_keywords: %s", e) + return JsonResponse(data, safe=False) @login_required def upload_tutorial(request, trid): @@ -1734,6 +1747,7 @@ def domain_review_index(request): collection = None ordering = '' header = '' + form = None try: raw_get_data = request.GET.get('o', None) header = { @@ -1760,7 +1774,7 @@ def domain_review_index(request): page = request.GET.get('page') collection = get_page(collection.qs, page) except Exception as e: - print(e) + logger.error("Error in domain_review_index: %s", e) context = { 'collection': collection, 'form': form, @@ -1775,16 +1789,16 @@ def domain_review_tutorial(request, trid): if not is_domainreviewer(request.user): raise PermissionDenied() try: - tr_rec = TutorialResource.objects.get(pk = trid, status = 0) - except: + tr_rec = TutorialResource.objects.get(pk=trid, status=0) + except Exception: raise PermissionDenied() - if DomainReviewerRole.objects.filter(user_id = request.user.id, foss_category_id = tr_rec.tutorial_detail.foss_id, language_id = tr_rec.language_id, status = 1).count() == 0: + if DomainReviewerRole.objects.filter(user_id=request.user.id, foss_category_id=tr_rec.tutorial_detail.foss_id, language_id=tr_rec.language_id, status=1).count() == 0: raise PermissionDenied() try: - contrib_log = ContributorLog.objects.filter(tutorial_resource_id = tr_rec.id).order_by('-created') - review_log = NeedImprovementLog.objects.filter(tutorial_resource_id = tr_rec.id).order_by('-created') - review_history = DomainReviewLog.objects.filter(tutorial_resource_id = tr_rec.id).order_by('-created') - except: + contrib_log = ContributorLog.objects.filter(tutorial_resource_id=tr_rec.id).order_by('-created') + review_log = NeedImprovementLog.objects.filter(tutorial_resource_id=tr_rec.id).order_by('-created') + review_history = DomainReviewLog.objects.filter(tutorial_resource_id=tr_rec.id).order_by('-created') + except Exception: contrib_log = None review_log = None review_history = None @@ -1803,18 +1817,20 @@ def domain_review_component(request, trid, component): if not is_domainreviewer(request.user): raise PermissionDenied() try: - tr = TutorialResource.objects.get(pk = trid, status = 0) + tr = TutorialResource.objects.get(pk=trid, status=0) comp_title = tr.tutorial_detail.foss.foss + ': ' + tr.tutorial_detail.tutorial + ' - ' + tr.language.name - except: + except Exception: raise PermissionDenied() - if DomainReviewerRole.objects.filter(user_id = request.user.id, foss_category_id = tr.tutorial_detail.foss_id, language_id = tr.language_id).count() == 0: + if DomainReviewerRole.objects.filter(user_id=request.user.id, foss_category_id=tr.tutorial_detail.foss_id, language_id=tr.language_id).count() == 0: raise PermissionDenied() response_msg = '' error_msg = '' if request.method == 'POST': form = DomainReviewComponentForm(request.POST) if form.is_valid(): - if request.POST['component_status'] == '3': + comp_status = str(form.cleaned_data.get('component_status', '')) + feedback = form.cleaned_data.get('feedback', '') + if comp_status == '3': try: execFlag = 0 if component == 'outline' or component == 'script' or component == 'video': @@ -1827,16 +1843,16 @@ def domain_review_component(request, trid, component): tr.common_content.save() execFlag = 1 if execFlag: - DomainReviewLog.objects.create(status = 3, component = component, user = request.user, tutorial_resource = tr) + DomainReviewLog.objects.create(status=3, component=component, user=request.user, tutorial_resource=tr) add_qualityreviewer_notification(tr, comp_title, component.title() + ' waiting for Quality review') add_contributor_notification(tr, comp_title, component.replace('_', ' ').title() + ' accepted by Domain reviewer') response_msg = 'Review status updated successfully!' else: error_msg = 'Something went wrong, please try again later.' except Exception as e: - print(e) + logger.error("Error updating component status 3: %s", e) error_msg = 'Something went wrong, please try again later.' - elif request.POST['component_status'] == '5': + elif comp_status == '5': try: prev_state = 0 if component == 'outline' or component == 'script' or component == 'video': @@ -1847,11 +1863,12 @@ def domain_review_component(request, trid, component): prev_state = getattr(tr.common_content, component + '_status') setattr(tr.common_content, component + '_status', 5) tr.common_content.save() - NeedImprovementLog.objects.create(user = request.user, tutorial_resource = tr, review_state = prev_state, component = component, comment = request.POST['feedback']) - DomainReviewLog.objects.create(status = 5, component = component, user = request.user, tutorial_resource = tr) + NeedImprovementLog.objects.create(user=request.user, tutorial_resource=tr, review_state=prev_state, component=component, comment=feedback) + DomainReviewLog.objects.create(status=5, component=component, user=request.user, tutorial_resource=tr) add_contributor_notification(tr, comp_title, component.title() + ' is under Need Improvement state') response_msg = 'Review status updated successfully!' - except: + except Exception as e: + logger.error("Error updating component status 5: %s", e) error_msg = 'Something went wrong, please try again later.' form = DomainReviewComponentForm() else: @@ -1874,6 +1891,7 @@ def domain_reviewed_tutorials(request): collection = None ordering = '' header = '' + form = None try: raw_get_data = request.GET.get('o', None) header = { @@ -1902,8 +1920,9 @@ def domain_reviewed_tutorials(request): form = collection.form page = request.GET.get('page') collection = get_page(collection.qs, page) - except: - messages.error('Something went wrong, Please try again later.') + except Exception as e: + logger.error("Error in domain_reviewed_tutorials: %s", e) + messages.error(request, 'Something went wrong, Please try again later.') context = { 'collection': collection, 'header': header, @@ -1913,6 +1932,7 @@ def domain_reviewed_tutorials(request): return render(request, 'creation/templates/domain_review_reviewed.html', context) +@login_required def accept_all(request, review, trid): status_flag = { 'domain': 3, @@ -2064,12 +2084,21 @@ def quality_review_index(request): if not is_qualityreviewer(request.user): raise PermissionDenied() tmp_ids = [] - qr_roles = QualityReviewerRole.objects.filter(user_id = request.user.id, status = 1) + qr_roles = QualityReviewerRole.objects.filter(user_id=request.user.id, status=1) for rec in qr_roles: if rec.language.name == 'English': - tr_recs = TutorialResource.objects.filter(Q(outline_status = 3) | Q(script_status = 3) | Q(video_status = 3) | Q(common_content__slide_status = 3) | Q(common_content__code_status = 3) | Q(common_content__assignment_status = 3) | Q(common_content__keyword_status = 3) | Q(common_content__prerequisite_status = 3) | Q(common_content__additional_material_status = 3), Q(tutorial_detail__foss_id = rec.foss_category_id) & Q(language_id = rec.language_id) & Q(status = 0)) + tr_recs = TutorialResource.objects.filter( + Q(outline_status=3) | Q(script_status=3) | Q(video_status=3) | + Q(common_content__slide_status=3) | Q(common_content__code_status=3) | + Q(common_content__assignment_status=3) | Q(common_content__keyword_status=3) | + Q(common_content__prerequisite_status=3) | Q(common_content__additional_material_status=3), + Q(tutorial_detail__foss_id=rec.foss_category_id) & Q(language_id=rec.language_id) & Q(status=0) + ) else: - tr_recs = TutorialResource.objects.filter(Q(outline_status = 3) | Q(script_status = 3) | Q(video_status = 3), Q(tutorial_detail__foss_id = rec.foss_category_id) & Q(language_id = rec.language_id) & Q(status = 0)).order_by('updated') + tr_recs = TutorialResource.objects.filter( + Q(outline_status=3) | Q(script_status=3) | Q(video_status=3), + Q(tutorial_detail__foss_id=rec.foss_category_id) & Q(language_id=rec.language_id) & Q(status=0) + ).order_by('updated') for tr_rec in tr_recs: tmp_ids.append(tr_rec.id) @@ -2077,6 +2106,7 @@ def quality_review_index(request): collection = None header = '' ordering = '' + form = None try: raw_get_data = request.GET.get('o', None) header = { @@ -2095,7 +2125,7 @@ def quality_review_index(request): 13: SortableHeader('Keywords', False, '', 'col-center'), 14: SortableHeader('', False, '', 'col-center') } - collection = TutorialResource.objects.filter(id__in = tmp_ids) + collection = TutorialResource.objects.filter(id__in=tmp_ids).select_related('tutorial_detail__foss', 'language', 'common_content') collection = get_sorted_list(request, collection, header, raw_get_data) ordering = get_field_index(raw_get_data) collection = ReviewerFilter(request.POST, queryset=collection) @@ -2103,7 +2133,7 @@ def quality_review_index(request): page = request.GET.get('page') collection = get_page(collection.qs, page) except Exception as e: - print(e) + logger.error("Error in quality_review_index: %s", e) context = { 'collection': collection, @@ -2118,12 +2148,22 @@ def publish_tutorial_index(request): if not is_qualityreviewer(request.user): raise PermissionDenied() tmp_ids = [] - qr_roles = QualityReviewerRole.objects.filter(user_id = request.user.id, status = 1) + qr_roles = QualityReviewerRole.objects.filter(user_id=request.user.id, status=1) for rec in qr_roles: if rec.language.name == 'English': - tr_recs = TutorialResource.objects.filter(Q(common_content__code_status = 4) | Q(common_content__code_status = 6), Q(common_content__assignment_status = 4) | Q(common_content__assignment_status = 6), Q(common_content__prerequisite_status = 4) | Q(common_content__prerequisite_status = 6), Q(outline_status = 4) & Q(script_status = 4) & Q(video_status = 4) & Q(common_content__slide_status = 4) & Q(common_content__keyword_status = 4) & Q(tutorial_detail__foss_id = rec.foss_category_id) & Q(language_id = rec.language_id) & Q(status = 0)) + tr_recs = TutorialResource.objects.filter( + Q(common_content__code_status=4) | Q(common_content__code_status=6), + Q(common_content__assignment_status=4) | Q(common_content__assignment_status=6), + Q(common_content__prerequisite_status=4) | Q(common_content__prerequisite_status=6), + Q(outline_status=4) & Q(script_status=4) & Q(video_status=4) & + Q(common_content__slide_status=4) & Q(common_content__keyword_status=4) & + Q(tutorial_detail__foss_id=rec.foss_category_id) & Q(language_id=rec.language_id) & Q(status=0) + ) else: - tr_recs = TutorialResource.objects.filter(Q(outline_status = 4) & Q(script_status = 4) & Q(video_status = 4) & Q(tutorial_detail__foss_id = rec.foss_category_id) & Q(language_id = rec.language_id) & Q(status = 0)).order_by('updated') + tr_recs = TutorialResource.objects.filter( + Q(outline_status=4) & Q(script_status=4) & Q(video_status=4) & + Q(tutorial_detail__foss_id=rec.foss_category_id) & Q(language_id=rec.language_id) & Q(status=0) + ).order_by('updated') for tr_rec in tr_recs: tmp_ids.append(tr_rec.id) @@ -2131,6 +2171,7 @@ def publish_tutorial_index(request): collection = None header = '' ordering = '' + form = None try: raw_get_data = request.GET.get('o', None) header = { @@ -2149,15 +2190,15 @@ def publish_tutorial_index(request): 13: SortableHeader('Keywords', False, '', 'col-center'), 14: SortableHeader('', False, '', 'col-center') } - collection = TutorialResource.objects.filter(id__in = tmp_ids) + collection = TutorialResource.objects.filter(id__in=tmp_ids).select_related('tutorial_detail__foss', 'language', 'common_content') collection = get_sorted_list(request, collection, header, raw_get_data) ordering = get_field_index(raw_get_data) collection = ReviewerFilter(request.POST, queryset=collection) form = collection.form page = request.GET.get('page') collection = get_page(collection.qs, page) - except: - pass + except Exception as e: + logger.error("Error in publish_tutorial_index: %s", e) context = { 'collection': collection, @@ -2253,7 +2294,9 @@ def public_review_list(request): 11: SortableHeader('Additional material', False, '', 'col-center'), 12: SortableHeader('Prerequisite', False, '', 'col-center'), 13: SortableHeader('Keywords', False, '', 'col-center'), - 14: SortableHeader('', False, '', 'col-center', 'colspan = 2') + 14: SortableHeader('Review Count', False, '', 'col-center'), + 15: SortableHeader('Comments Count', False, '', 'col-center'), + 16: SortableHeader('Final Review', False, '', 'col-center') } collection = TutorialResource.objects.filter(id__in = tmp_ids) collection = get_sorted_list(request, collection, header, raw_get_data) @@ -2362,16 +2405,16 @@ def quality_review_tutorial(request, trid): if not is_qualityreviewer(request.user): raise PermissionDenied() try: - tr_rec = TutorialResource.objects.get(pk = trid, status = 0) - except: + tr_rec = TutorialResource.objects.get(pk=trid, status=0) + except Exception: raise PermissionDenied() - if QualityReviewerRole.objects.filter(user_id = request.user.id, foss_category_id = tr_rec.tutorial_detail.foss_id, language_id = tr_rec.language_id, status = 1).count() == 0: + if QualityReviewerRole.objects.filter(user_id=request.user.id, foss_category_id=tr_rec.tutorial_detail.foss_id, language_id=tr_rec.language_id, status=1).count() == 0: raise PermissionDenied() try: - contrib_log = ContributorLog.objects.filter(tutorial_resource_id = tr_rec.id).order_by('-created') - review_log = NeedImprovementLog.objects.filter(tutorial_resource_id = tr_rec.id).order_by('-created') - review_history = QualityReviewLog.objects.filter(tutorial_resource_id = tr_rec.id).order_by('-created') - except: + contrib_log = ContributorLog.objects.filter(tutorial_resource_id=tr_rec.id).order_by('-created') + review_log = NeedImprovementLog.objects.filter(tutorial_resource_id=tr_rec.id).order_by('-created') + review_history = QualityReviewLog.objects.filter(tutorial_resource_id=tr_rec.id).order_by('-created') + except Exception: contrib_log = None review_log = None review_history = None @@ -2390,18 +2433,20 @@ def quality_review_component(request, trid, component): if not is_qualityreviewer(request.user): raise PermissionDenied() try: - tr = TutorialResource.objects.get(pk = trid, status = 0) + tr = TutorialResource.objects.get(pk=trid, status=0) comp_title = tr.tutorial_detail.foss.foss + ': ' + tr.tutorial_detail.tutorial + ' - ' + tr.language.name - except: + except Exception: raise PermissionDenied() - if QualityReviewerRole.objects.filter(user_id = request.user.id, foss_category_id = tr.tutorial_detail.foss_id, language_id = tr.language_id, status = 1).count() == 0: + if QualityReviewerRole.objects.filter(user_id=request.user.id, foss_category_id=tr.tutorial_detail.foss_id, language_id=tr.language_id, status=1).count() == 0: raise PermissionDenied() response_msg = '' error_msg = '' if request.method == 'POST': form = QualityReviewComponentForm(request.POST) if form.is_valid(): - if request.POST['component_status'] == '4': + comp_status = str(form.cleaned_data.get('component_status', '')) + feedback = form.cleaned_data.get('feedback', '') + if comp_status == '4': try: execFlag = 0 if component == 'outline' or component == 'script' or component == 'video': @@ -2415,14 +2460,15 @@ def quality_review_component(request, trid, component): execFlag = 1 if execFlag: comp_message = component.title() + ' accepted by Quality reviewer' - QualityReviewLog.objects.create(status = 4, component = component, user = request.user, tutorial_resource = tr) + QualityReviewLog.objects.create(status=4, component=component, user=request.user, tutorial_resource=tr) add_contributor_notification(tr, comp_title, comp_message) response_msg = 'Review status updated successfully!' else: error_msg = 'Something went wrong, please try again later.' except Exception as e: + logger.error("Error in quality_review_component status 4: %s", e) error_msg = 'Something went wrong, please try again later.' - elif request.POST['component_status'] == '5': + elif comp_status == '5': try: prev_state = 0 execFlag = 0 @@ -2438,14 +2484,15 @@ def quality_review_component(request, trid, component): tr.common_content.save() execFlag = 1 if execFlag: - NeedImprovementLog.objects.create(user = request.user, tutorial_resource = tr, review_state = prev_state, component = component, comment = request.POST['feedback']) + NeedImprovementLog.objects.create(user=request.user, tutorial_resource=tr, review_state=prev_state, component=component, comment=feedback) comp_message = component.title() + ' is under Need Improvement state' - QualityReviewLog.objects.create(status = 5, component = component, user = request.user, tutorial_resource = tr) + QualityReviewLog.objects.create(status=5, component=component, user=request.user, tutorial_resource=tr) add_contributor_notification(tr, comp_title, comp_message) response_msg = 'Review status updated successfully!' else: error_msg = 'Something went wrong, please try again later.' - except: + except Exception as e: + logger.error("Error in quality_review_component status 5: %s", e) error_msg = 'Something went wrong, please try again later.' form = QualityReviewComponentForm() else: @@ -2469,16 +2516,16 @@ def public_review_tutorial(request, trid): if not is_qualityreviewer(request.user): raise PermissionDenied() try: - tr_rec = TutorialResource.objects.get(pk = trid, status = 0) + tr_rec = TutorialResource.objects.get(pk=trid, status=0) comp_title = tr_rec.tutorial_detail.foss.foss + ': ' + tr_rec.tutorial_detail.tutorial + ' - ' + tr_rec.language.name - except: + except Exception: raise PermissionDenied() - if QualityReviewerRole.objects.filter(user_id = request.user.id, foss_category_id = tr_rec.tutorial_detail.foss_id, language_id = tr_rec.language_id, status = 1).count() == 0: + if QualityReviewerRole.objects.filter(user_id=request.user.id, foss_category_id=tr_rec.tutorial_detail.foss_id, language_id=tr_rec.language_id, status=1).count() == 0: raise PermissionDenied() if tr_rec.language.name != 'English' and (tr_rec.outline_status > 0 and tr_rec.outline_status != 5) and (tr_rec.script_status > 0 and tr_rec.script_status != 5) and (tr_rec.video_status > 0 and tr_rec.video_status != 5): tr_rec.status = 2 tr_rec.save() - PublicReviewLog.objects.create(user = request.user, tutorial_resource = tr_rec) + PublicReviewLog.objects.create(user=request.user, tutorial_resource=tr_rec) add_contributor_notification(tr_rec, comp_title, 'This tutorial is now available for Public review') messages.success(request, 'The selected tutorial is now available for Public review') else: @@ -2488,15 +2535,14 @@ def public_review_tutorial(request, trid): @login_required def publish_tutorial(request, trid): - tr_rec = TutorialResource.objects.get(id = trid) if not is_qualityreviewer(request.user): raise PermissionDenied() try: - tr_rec = TutorialResource.objects.get(pk = trid, status = 0) + tr_rec = TutorialResource.objects.get(pk=trid, status=0) comp_title = tr_rec.tutorial_detail.foss.foss + ': ' + tr_rec.tutorial_detail.tutorial + ' - ' + tr_rec.language.name - except: + except Exception: raise PermissionDenied() - if QualityReviewerRole.objects.filter(user_id = request.user.id, foss_category_id = tr_rec.tutorial_detail.foss_id, language_id = tr_rec.language_id, status = 1).count() == 0: + if QualityReviewerRole.objects.filter(user_id=request.user.id, foss_category_id=tr_rec.tutorial_detail.foss_id, language_id=tr_rec.language_id, status=1).count() == 0: raise PermissionDenied() flag = 0 if tr_rec.language.name == 'English': @@ -2508,14 +2554,14 @@ def publish_tutorial(request, trid): tr_rec.status = 1 tr_rec.publish_at = timezone.now() tr_rec.save() - PublishTutorialLog.objects.create(user = request.user, tutorial_resource = tr_rec) + PublishTutorialLog.objects.create(user=request.user, tutorial_resource=tr_rec) create_payment_instance(request, tr_rec) # create instance of tutorial payment # add tutorials available here refresh_tutorials(request, tr_rec) add_contributor_notification(tr_rec, comp_title, 'This tutorial is published now') messages.success(request, 'The selected tutorial is published successfully') else: - messages.error(request, 'The selected tutorial cannot be marked as Public review') + messages.error(request, 'The selected tutorial cannot be published') return HttpResponseRedirect('/creation/quality-review/tutorial/publish/index/') @@ -2525,6 +2571,7 @@ def quality_reviewed_tutorials(request): collection = None header = '' ordering = '' + form = None try: raw_get_data = request.GET.get('o', None) header = { @@ -2544,15 +2591,16 @@ def quality_reviewed_tutorials(request): 14: SortableHeader('Status', False, '', 'col-center'), 15: SortableHeader('publishtutoriallog__created', True, 'Date') } - collection = TutorialResource.objects.filter(id__in = QualityReviewLog.objects.filter(user = request.user).values_list('tutorial_resource_id').distinct()) + collection = TutorialResource.objects.filter(id__in=QualityReviewLog.objects.filter(user=request.user).values_list('tutorial_resource_id').distinct()).select_related('tutorial_detail__foss', 'language', 'common_content') collection = get_sorted_list(request, collection, header, raw_get_data) ordering = get_field_index(raw_get_data) page = request.GET.get('page') collection = ReviewerFilter(request.POST, queryset=collection) form = collection.form collection = get_page(collection.qs, page) - except: - messages.error('Something went wrong, Please try again later.') + except Exception as e: + logger.error("Error in quality_reviewed_tutorials: %s", e) + messages.error(request, 'Something went wrong, Please try again later.') context = { 'collection': collection, 'header': header, @@ -2635,7 +2683,12 @@ def creation_change_published_to_pending(request): form = PublishToPending(request.POST) if form.is_valid(): try: - row = TutorialResource.objects.get(tutorial_detail_id = request.POST.get('tutorial_name'), language_id = request.POST.get('language')) + tutorial_detail_id = form.cleaned_data.get('tutorial_name') + language_id = form.cleaned_data.get('language') + row = TutorialResource.objects.select_related('tutorial_detail__foss', 'language').get( + tutorial_detail_id=tutorial_detail_id, + language_id=language_id + ) comp_title = row.tutorial_detail.foss.foss + ': ' + row.tutorial_detail.tutorial + ' - ' + row.language.name row.status = 0 row.save() @@ -2649,7 +2702,6 @@ def creation_change_published_to_pending(request): context = { 'form': form } - context.update(csrf(request)) return render(request, 'creation/templates/creation_change_published_to_pending.html', context) @@ -2657,29 +2709,30 @@ def creation_change_published_to_pending(request): def ajax_publish_to_pending(request): data = '' if request.method == 'POST': - foss = '' - lang = '' - try: - foss = request.POST.get('foss') - lang = request.POST.get('lang') - except: - foss = '' - lang = '' + foss = request.POST.get('foss', '') + lang = request.POST.get('lang', '') if foss and lang: - td_list = TutorialDetail.objects.filter(foss_id = foss).values_list('id') - tutorials = TutorialResource.objects.filter(tutorial_detail_id__in = td_list, language_id = lang, status = 1).distinct().order_by('tutorial_detail__level_id', 'tutorial_detail__order') + td_list = TutorialDetail.objects.filter(foss_id=foss).values_list('id') + tutorials = TutorialResource.objects.filter( + tutorial_detail_id__in=td_list, language_id=lang, status=1 + ).distinct().order_by('tutorial_detail__level_id', 'tutorial_detail__order') for tutorial in tutorials: data += '' if data: data = '' + data elif foss: - languages = Language.objects.filter(id__in = TutorialResource.objects.filter(tutorial_detail__in = TutorialDetail.objects.filter(foss_id = foss).values_list('id'), status = 1).values_list('language_id').distinct()) + languages = Language.objects.filter( + id__in=TutorialResource.objects.filter( + tutorial_detail__in=TutorialDetail.objects.filter(foss_id=foss).values_list('id'), + status=1 + ).values_list('language_id').distinct() + ).order_by('name') for language in languages: data += '' if data: data = '' + data - return HttpResponse(json.dumps(data), content_type = 'application/json') + return JsonResponse(data, safe=False) @login_required @@ -2690,20 +2743,26 @@ def creation_change_component_status(request): form = ChangeComponentStatusForm(request.POST) if form.is_valid(): try: - row = TutorialResource.objects.get(tutorial_detail_id = request.POST.get('tutorial_name'), language_id = request.POST.get('language')) + tutorial_detail_id = form.cleaned_data.get('tutorial_name') + language_id = form.cleaned_data.get('language') + row = TutorialResource.objects.select_related('tutorial_detail__foss', 'language', 'common_content').get( + tutorial_detail_id=tutorial_detail_id, + language_id=language_id + ) comp_title = row.tutorial_detail.foss.foss + ': ' + row.tutorial_detail.tutorial + ' - ' + row.language.name status_list = { 0: 'Pending', 5: 'Need Improvement', 6: 'Not Required' } - component = request.POST.get('component', '') - status = status_list[int(request.POST.get('status', 0))] + component = form.cleaned_data.get('component', '') + status_val = int(form.cleaned_data.get('status', 0)) + status = status_list.get(status_val, 'Unknown') if component in ['outline', 'script', 'video']: - setattr(row, component + '_status', int(request.POST.get('status', 0))) + setattr(row, component + '_status', status_val) row.save() else: - setattr(row.common_content, component + '_status', int(request.POST.get('status', 0))) + setattr(row.common_content, component + '_status', status_val) row.common_content.save() add_contributor_notification(row, comp_title, component.title() + ' status has been changed to ' + status) messages.success(request, component.title() + ' status has been changed to ' + status) @@ -2715,7 +2774,6 @@ def creation_change_component_status(request): context = { 'form': form } - context.update(csrf(request)) return render(request, 'creation/templates/creation_change_component_status.html', context) @@ -2728,39 +2786,49 @@ def ajax_change_component_status(request): tut = request.POST.get('tut', '') comp = request.POST.get('comp', '') if foss and lang and tut and comp: - tr_rec = TutorialResource.objects.get(tutorial_detail_id = tut, language = lang) + tr_rec = TutorialResource.objects.select_related('common_content').filter( + tutorial_detail_id=tut, language_id=lang + ).first() compValue = None data = '' - if comp in ['outline', 'script', 'video']: - compValue = getattr(tr_rec, comp + '_status') - else: - compValue = getattr(tr_rec.common_content, comp + '_status') + if tr_rec: + if comp in ['outline', 'script', 'video']: + compValue = getattr(tr_rec, comp + '_status', None) + elif hasattr(tr_rec, 'common_content') and tr_rec.common_content: + compValue = getattr(tr_rec.common_content, comp + '_status', None) if compValue: data += '' if comp in ['code', 'assignment', 'additional_material']: data += '' elif foss and lang: data = ['', ''] - td_list = TutorialDetail.objects.filter(foss_id = foss).values_list('id') - lang_rec = Language.objects.get(pk = lang) - tutorials = TutorialResource.objects.filter(tutorial_detail_id__in = td_list, language_id = lang, status = 0).distinct() + td_list = TutorialDetail.objects.filter(foss_id=foss).values_list('id') + lang_rec = Language.objects.filter(pk=lang).first() + tutorials = TutorialResource.objects.filter( + tutorial_detail_id__in=td_list, language_id=lang, status=0 + ).distinct() data[0] = '' data[1] = '' for tutorial in tutorials: data[0] += '' - if lang_rec.name == 'English': + if lang_rec and lang_rec.name == 'English': data[1] += '' else: data[1] += '' data[1] = '' + data[1] elif foss: - languages = Language.objects.filter(id__in = TutorialResource.objects.filter(tutorial_detail__in = TutorialDetail.objects.filter(foss_id = foss).values_list('id'), status = 0).values_list('language_id').distinct()) + languages = Language.objects.filter( + id__in=TutorialResource.objects.filter( + tutorial_detail__in=TutorialDetail.objects.filter(foss_id=foss).values_list('id'), + status=0 + ).values_list('language_id').distinct() + ).order_by('name') for language in languages: data += '' if data: data = '' + data - return HttpResponse(json.dumps(data), content_type = 'application/json') + return JsonResponse(data, safe=False) def report_missing_component(request, trid): @@ -2773,28 +2841,28 @@ def report_missing_component(request, trid): 6: 'assignment' } try: - tr_rec = TutorialResource.objects.get(pk = trid) + tr_rec = TutorialResource.objects.get(pk=trid) comp_title = tr_rec.tutorial_detail.foss.foss + ': ' + tr_rec.tutorial_detail.tutorial + ' - ' + tr_rec.language.name - except: + except Exception: raise PermissionDenied() form = TutorialMissingComponentForm(request.user) if request.method == 'POST': form = TutorialMissingComponentForm(request.user, request.POST) if form.is_valid(): remarks = '' - component = int(request.POST.get('component')) - report_type = int(request.POST.get('report_type')) + component = int(form.cleaned_data.get('component')) + report_type = int(form.cleaned_data.get('report_type')) if report_type: - remarks = request.POST.get('remarks') + remarks = form.cleaned_data.get('remarks') or '' else: compStatus = 0 compValue = '' if component <= 3: - compStatus = getattr(tr_rec, comps[component] + '_status') - compValue = getattr(tr_rec, comps[component]) + compStatus = getattr(tr_rec, comps[component] + '_status', 0) + compValue = getattr(tr_rec, comps[component], '') else: - compStatus = getattr(tr_rec.common_content, comps[component] + '_status') - compValue = getattr(tr_rec.common_content, comps[component]) + compStatus = getattr(tr_rec.common_content, comps[component] + '_status', 0) if hasattr(tr_rec, 'common_content') and tr_rec.common_content else 0 + compValue = getattr(tr_rec.common_content, comps[component], '') if hasattr(tr_rec, 'common_content') and tr_rec.common_content else '' flag = 0 if compStatus == 6: flag = 1 @@ -2804,41 +2872,40 @@ def report_missing_component(request, trid): flag = 1 messages.warning(request, 'The selected component is available. However if you wish to report an error, please click on "Some content is missing" radio button.') if component <= 3: - if component != 1 and os.path.isfile(settings.MEDIA_ROOT + 'videos/' + str(tr_rec.tutorial_detail.foss_id) + '/' + str(tr_rec.tutorial_detail_id) + '/' + compValue): + if component != 1 and os.path.isfile(os.path.join(settings.MEDIA_ROOT, 'videos', str(tr_rec.tutorial_detail.foss_id), str(tr_rec.tutorial_detail_id), compValue)): flag = 1 messages.warning(request, 'The selected component is available. However if you wish to report an error, please click on "Some content is missing" radio button.') else: - if os.path.isfile(settings.MEDIA_ROOT + 'videos/resources/' + str(tr_rec.tutorial_detail.foss_id) + '/' + str(tr_rec.tutorial_detail_id) + '/' + compValue): + if os.path.isfile(os.path.join(settings.MEDIA_ROOT, 'videos', 'resources', str(tr_rec.tutorial_detail.foss_id), str(tr_rec.tutorial_detail_id), compValue)): flag = 1 messages.warning(request, 'The selected component is available. However if you wish to report an error, please click on "Some content is missing" radio button.') if flag: context = { 'form': form, } - context.update(csrf(request)) return render(request, 'creation/templates/report_missing_component.html', context) email = '' - inform_me = request.POST.get('inform_me') - if inform_me and request.user.is_authenticated() == False: - email = request.POST.get('email', '') - if request.user.is_authenticated(): + inform_me = form.cleaned_data.get('inform_me') + if inform_me and not request.user.is_authenticated: + email = form.cleaned_data.get('email', '') + if request.user.is_authenticated: TutorialMissingComponent.objects.create( - user = request.user, - tutorial_resource = tr_rec, - component = component, - report_type = report_type, - remarks = remarks, - inform_me = inform_me, - email = email, + user=request.user, + tutorial_resource=tr_rec, + component=component, + report_type=report_type, + remarks=remarks, + inform_me=inform_me, + email=email, ) else: TutorialMissingComponent.objects.create( - tutorial_resource = tr_rec, - component = component, - report_type = report_type, - remarks = remarks, - inform_me = inform_me, - email = email, + tutorial_resource=tr_rec, + component=component, + report_type=report_type, + remarks=remarks, + inform_me=inform_me, + email=email, ) add_contributor_notification(tr_rec, comp_title, 'Component missing form submitted by public') form = TutorialMissingComponentForm(request.user) @@ -2846,7 +2913,6 @@ def report_missing_component(request, trid): context = { 'form': form } - context.update(csrf(request)) return render(request, 'creation/templates/report_missing_component.html', context) @@ -2874,14 +2940,19 @@ def report_missing_component_reply(request, tmcid): raise PermissionDenied() tmc_row = None try: - tmc_row = TutorialMissingComponent.objects.get(pk = tmcid) - except: + tmc_row = TutorialMissingComponent.objects.get(pk=tmcid) + except Exception: raise PermissionDenied() form = TutorialMissingComponentReplyForm() if request.method == 'POST': form = TutorialMissingComponentReplyForm(request.POST) if form.is_valid(): - TutorialMissingComponentReply.objects.create(missing_component = tmc_row, user = request.user, reply_message = request.POST.get('reply_message', '')) + reply_msg = form.cleaned_data.get('reply_message', '') + TutorialMissingComponentReply.objects.create( + missing_component=tmc_row, + user=request.user, + reply_message=reply_msg + ) if tmc_row.inform_me: # send email to = [] @@ -2903,7 +2974,7 @@ def report_missing_component_reply(request, tmcid): else: to = [tmc_row.email] bcc = settings.ADMINISTRATOR_EMAIL - except: + except Exception: raise PermissionDenied() subject = "Reply: Missing Component Reply Notifications" message = '''Dear {0}, @@ -2919,26 +2990,22 @@ def report_missing_component_reply(request, tmcid): -- Regards, Spoken Tutorial -'''.format(username, request.POST.get('reply_message', ''), tmc_row.tutorial_resource.tutorial_detail.foss, tmc_row.tutorial_resource.tutorial_detail.tutorial, tmc_row.tutorial_resource.language, comps[tmc_row.component]) - # send email +'''.format(username, reply_msg, tmc_row.tutorial_resource.tutorial_detail.foss, tmc_row.tutorial_resource.tutorial_detail.tutorial, tmc_row.tutorial_resource.language, comps.get(tmc_row.component, 'Component')) email = EmailMultiAlternatives( subject, message, 'no-reply@spoken-tutorial.org', - to = to, bcc = bcc, cc = cc, - headers = {'Reply-To': 'no-reply@spoken-tutorial.org', "Content-type": "text/html;charset = iso-8859-1"} + to=to, bcc=bcc, cc=cc, + headers={'Reply-To': 'no-reply@spoken-tutorial.org', "Content-type": "text/html;charset=iso-8859-1"} ) try: - result = email.send(fail_silently=False) + email.send(fail_silently=False) except Exception as e: - print("*******************************************************") - print(message) - print("*******************************************************") + logger.error("Error sending missing component reply email: %s", e) messages.success(request, 'Reply message added successfully!') form = TutorialMissingComponentReplyForm() context = { 'form': form, 'tmc_row': tmc_row } - context.update(csrf(request)) return render(request, 'creation/templates/report_missing_component_reply.html', context) @@ -2946,16 +3013,29 @@ def report_missing_component_reply(request, tmcid): def report_missing_component_list(request): if not is_contributor(request.user) and not is_administrator(request.user): raise PermissionDenied() - rows = None + rows = TutorialMissingComponent.objects.none() if is_administrator(request.user): - rows = TutorialMissingComponent.objects.all().order_by('-created') + rows = TutorialMissingComponent.objects.all().select_related( + 'user', + 'tutorial_resource__tutorial_detail__foss', + 'tutorial_resource__language' + ).order_by('-created') elif is_contributor(request.user): - contrib_roles = list(ContributorRole.objects.filter(user = request.user).values_list('foss_category_id', 'language_id')) - fields = ['tutorial_resource__tutorial_detail__foss_id', 'tutorial_resource__language_id'] - query = get_and_query_for_contributor_roles(contrib_roles, fields) - rows = TutorialMissingComponent.objects.filter(query).order_by('-created') + contrib_roles = list(ContributorRole.objects.filter(user=request.user).values_list('foss_category_id', 'language_id')) + if contrib_roles: + fields = ['tutorial_resource__tutorial_detail__foss_id', 'tutorial_resource__language_id'] + query = get_and_query_for_contributor_roles(contrib_roles, fields) + if query: + rows = TutorialMissingComponent.objects.filter(query).select_related( + 'user', + 'tutorial_resource__tutorial_detail__foss', + 'tutorial_resource__language' + ).order_by('-created') + page = request.GET.get('page') + rows = get_page(rows, page, 50) context = { - 'rows': rows + 'rows': rows, + 'collection': rows, } return render(request, 'creation/templates/report_missing_component_list.html', context) @@ -3033,25 +3113,31 @@ def update_prerequisite(request): form = UpdatePrerequisiteForm(request.POST) if form.is_valid(): try: - source_tutorial = TutorialDetail.objects.get(pk = form.cleaned_data['source_tutorial'], foss_id = form.cleaned_data['source_foss']) - tcc = TutorialCommonContent.objects.get(tutorial_detail = source_tutorial) - if int(form.cleaned_data['destination_tutorial']) == 0: + source_tutorial = TutorialDetail.objects.get( + pk=form.cleaned_data['source_tutorial'], + foss_id=form.cleaned_data['source_foss'] + ) + tcc, _ = TutorialCommonContent.objects.get_or_create(tutorial_detail=source_tutorial) + if str(form.cleaned_data['destination_tutorial']) == '0': tcc.prerequisite_id = None tcc.prerequisite_status = 6 messages.success(request, 'Prerequisite for ' + source_tutorial.tutorial + ' updated to Not Required') else: - destination_tutorial = TutorialDetail.objects.get(pk = form.cleaned_data['destination_tutorial'], foss_id = form.cleaned_data['destination_foss']) + destination_tutorial = TutorialDetail.objects.get( + pk=form.cleaned_data['destination_tutorial'], + foss_id=form.cleaned_data['destination_foss'] + ) tcc.prerequisite_id = destination_tutorial.id tcc.prerequisite_status = 4 messages.success(request, 'Prerequisite ' + destination_tutorial.tutorial + ' updated to ' + source_tutorial.tutorial + '.') tcc.save() return HttpResponseRedirect('/creation/update-prerequisite/') - except Exception: - pass + except Exception as e: + logger.error("Error in update_prerequisite: %s", e) + messages.error(request, str(e)) context = { 'form': form } - context.update(csrf(request)) return render(request, 'creation/templates/update_prerequisite.html', context) @@ -3064,19 +3150,21 @@ def update_keywords(request): form = UpdateKeywordsForm(request.POST) if form.is_valid(): try: - tcc = TutorialCommonContent.objects.get(tutorial_detail_id = request.POST.get('tutorial')) - tcc.keyword = request.POST.get('keywords') + tutorial_detail_id = form.cleaned_data.get('tutorial') + keywords = form.cleaned_data.get('keywords') + tcc, _ = TutorialCommonContent.objects.get_or_create(tutorial_detail_id=tutorial_detail_id) + tcc.keyword = keywords tcc.keyword_user = request.user tcc.keyword_status = 4 tcc.save() messages.success(request, 'Keywords updated successfully!') return HttpResponseRedirect('/creation/update-keywords/') except Exception as e: - pass + logger.error("Error in update_keywords: %s", e) + messages.error(request, str(e)) context = { 'form': form } - context.update(csrf(request)) return render(request, 'creation/templates/update_keywords.html', context) @@ -3084,41 +3172,42 @@ def update_keywords(request): def update_sheet(request, sheet_type): sheet_types = ['instruction', 'installation', 'brochure'] if not is_administrator(request.user) and not is_contributor(request.user) and not is_contenteditor(request.user)\ - or not sheet_type in sheet_types: + or sheet_type not in sheet_types: raise PermissionDenied() form = UpdateSheetsForm() if request.method == 'POST': form = UpdateSheetsForm(request.POST, request.FILES) if form.is_valid(): try: - foss_id = request.POST.get('foss') - foss = FossCategory.objects.get(pk = foss_id) - language_id = request.POST.get('language') - language = Language.objects.get(pk = language_id) + foss_id = form.cleaned_data.get('foss') + foss = FossCategory.objects.get(pk=foss_id) + language_id = form.cleaned_data.get('language') + language = Language.objects.get(pk=language_id) if sheet_type == 'brochure': - sheet_path = 'videos/' + str(foss.id) + '/' + \ - foss.foss.replace(' ', '-') + '-' + sheet_type.title() + \ - '-' + language.name + '.pdf' + sheet_path = os.path.join( + 'videos', str(foss.id), + foss.foss.replace(' ', '-') + '-' + sheet_type.title() + '-' + language.name + '.pdf' + ) else: - sheet_path = 'videos/' + str(foss.id) + '/' + \ - foss.foss.replace(' ', '-') + '-' + sheet_type.title() + \ - '-Sheet-' + language.name + '.pdf' - fout = open(settings.MEDIA_ROOT + sheet_path, 'wb+') - f = request.FILES['comp'] - # Iterate through the chunks. - for chunk in f.chunks(): - fout.write(chunk) - fout.close() - messages.success(request, sheet_type.title() - + 'sheet uploaded successfully!') + sheet_path = os.path.join( + 'videos', str(foss.id), + foss.foss.replace(' ', '-') + '-' + sheet_type.title() + '-Sheet-' + language.name + '.pdf' + ) + full_path = os.path.join(settings.MEDIA_ROOT, sheet_path) + os.makedirs(os.path.dirname(full_path), exist_ok=True) + uploaded_file = request.FILES['comp'] + with open(full_path, 'wb+') as fout: + for chunk in uploaded_file.chunks(): + fout.write(chunk) + messages.success(request, sheet_type.title() + ' sheet uploaded successfully!') form = UpdateSheetsForm() except Exception as e: - print(e) + logger.error("Error in update_sheet: %s", e) + messages.error(request, str(e)) context = { 'form': form, 'sheet_type': sheet_type } - context.update(csrf(request)) return render(request, 'creation/templates/update_sheet.html', context) @@ -3131,33 +3220,30 @@ def ajax_manual_language(request): sheet_type = request.POST.get('sheet_type', '') if foss_id and language_id and sheet_type: try: - foss = FossCategory.objects.get(pk = foss_id) - language = Language.objects.get(pk = language_id) - sheet_path = 'videos/' + str(foss.id) + '/' + \ - foss.foss + '-' + sheet_type.title() + '-Sheet-' + \ - language.name + '.pdf' - if os.path.isfile(settings.MEDIA_ROOT + sheet_path): - data = ' Click here to view the currently \ - available instruction sheet for the tutorial selected \ - above' + foss = FossCategory.objects.get(pk=foss_id) + language = Language.objects.get(pk=language_id) + sheet_path = os.path.join( + 'videos', str(foss.id), + foss.foss + '-' + sheet_type.title() + '-Sheet-' + language.name + '.pdf' + ) + full_path = os.path.join(settings.MEDIA_ROOT, sheet_path) + if os.path.isfile(full_path): + data = ' Click here to view the currently available instruction sheet for the tutorial selected above' except Exception as e: - print(e) - pass + logger.error("Error in ajax_manual_language: %s", e) elif foss_id: tutorials = TutorialResource.objects.filter( - Q(status = 1) | Q(status = 2), - tutorial_detail__foss_id = foss_id + Q(status=1) | Q(status=2), + tutorial_detail__foss_id=foss_id ).values_list( 'language_id', 'language__name' ).order_by('language__name').distinct() for tutorial in tutorials: - data += '' + data += '' if data: data = '' + data - return HttpResponse(json.dumps(data), content_type = 'application/json') + return JsonResponse(data, safe=False) @csrf_exempt @@ -3167,30 +3253,28 @@ def ajax_get_tutorials(request): foss_id = request.POST.get('foss', '') if foss_id: tutorials = TutorialResource.objects.filter( - Q(status = 1) | Q(status = 2), - tutorial_detail__foss_id = foss_id + Q(status=1) | Q(status=2), + tutorial_detail__foss_id=foss_id ).values_list( 'tutorial_detail_id', 'tutorial_detail__tutorial' ).order_by('tutorial_detail__tutorial').distinct() for tutorial in tutorials: - data += '' + data += '' if data: data = '' + data - return HttpResponse(json.dumps(data), content_type = 'application/json') + return JsonResponse(data, safe=False) def view_brochure(request): template = 'creation/templates/view_brochure.html' my_dict = services.get_data_for_brochure_display() st_brochure = BrochureDocument.objects.filter(foss_course=36) - pages = BrochurePage.objects.filter(brochure_id=st_brochure) - st_pages=[] + pages = BrochurePage.objects.filter(brochure__in=st_brochure) + st_pages = [] for page in pages: st_pages.append(page.page.url) - context = { 'my_dict': my_dict, 'st_pages': st_pages @@ -3207,36 +3291,36 @@ def update_assignment(request): form = UpdateAssignmentForm(request.POST, request.FILES) if form.is_valid(): try: - foss_id = request.POST.get('foss') - foss = FossCategory.objects.get(pk = foss_id) + foss_id = form.cleaned_data.get('foss') + foss = FossCategory.objects.get(pk=foss_id) - tutorial_detail_id = request.POST.get('tutorial') - tutorial = TutorialDetail.objects.get(pk = tutorial_detail_id) + tutorial_detail_id = form.cleaned_data.get('tutorial') + tutorial = TutorialDetail.objects.get(pk=tutorial_detail_id) file_name, file_extension = os.path.splitext(request.FILES['comp'].name) file_name = tutorial.tutorial.replace(' ', '-') + '-Assignment' + file_extension - file_path = settings.MEDIA_ROOT + 'videos/' + str(foss_id) + '/' + str(tutorial_detail_id) + '/resources/' + file_name + file_path = os.path.join(settings.MEDIA_ROOT, 'videos', str(foss_id), str(tutorial_detail_id), 'resources', file_name) + os.makedirs(os.path.dirname(file_path), exist_ok=True) - fout = open(file_path, 'wb+') - f = request.FILES['comp'] - # Iterate through the chunks. - for chunk in f.chunks(): - fout.write(chunk) - fout.close() + uploaded_file = request.FILES['comp'] + with open(file_path, 'wb+') as fout: + for chunk in uploaded_file.chunks(): + fout.write(chunk) - tr_res = TutorialResource.objects.get(tutorial_detail = tutorial_detail_id, language_id = 22) - tr_res.common_content.assignment = file_name - tr_res.common_content.assignment_status = 4 - tr_res.common_content.assignment_user = request.user - tr_res.common_content.save() + tr_res = TutorialResource.objects.filter(tutorial_detail_id=tutorial_detail_id, language_id=22).select_related('common_content').first() + if tr_res and hasattr(tr_res, 'common_content') and tr_res.common_content: + tr_res.common_content.assignment = file_name + tr_res.common_content.assignment_status = 4 + tr_res.common_content.assignment_user = request.user + tr_res.common_content.save() messages.success(request, 'Assignment updated successfully!') form = UpdateAssignmentForm() except Exception as e: - print(e) + logger.error("Error in update_assignment: %s", e) + messages.error(request, str(e)) context = { 'form': form, } - context.update(csrf(request)) return render(request, 'creation/templates/update_assignment.html', context) @@ -3524,8 +3608,8 @@ def detail_payment_honorarium(request, hr_id): next_url = request.GET.get("next",reverse('creation:payment_honorarium_detail', args=[hr_id])) return HttpResponseRedirect(next_url) elif "hono_id" in request.POST: - os.remove(loc+request.POST['hono_id']) - return HttpResponse(json.dumps('deleted'), content_type='application/json') + os.remove(loc + request.POST['hono_id']) + return JsonResponse('deleted', safe=False) elif 'agreement' in request.FILES: myfile = request.FILES['agreement'] if pdf_extn_check(myfile): @@ -3618,49 +3702,15 @@ def money_as_text(amount): ans += "Only" return ans +@login_required def update_codefiles(request): if not is_administrator(request.user): raise PermissionDenied() - form = UpdateCodefilesForm() - if request.method == 'POST': - form = UpdateCodefilesForm(request.POST, request.FILES) - if form.is_valid(): - try: - foss_id = request.POST.get('foss') - foss = FossCategory.objects.get(pk = foss_id) - - tutorial_detail_id = request.POST.get('tutorial') - tutorial = TutorialDetail.objects.get(pk = tutorial_detail_id) - file_name, file_extension = os.path.splitext(request.FILES['comp'].name) - file_name = tutorial.tutorial.replace(' ', '-') + '-Codefiles' + file_extension - file_path = settings.MEDIA_ROOT + 'videos/' + str(foss_id) + '/' + str(tutorial_detail_id) + '/resources/' + file_name - - fout = open(file_path, 'wb+') - f = request.FILES['comp'] - # Iterate through the chunks. - for chunk in f.chunks(): - fout.write(chunk) - fout.close() - - tr_res = TutorialResource.objects.get(tutorial_detail = tutorial_detail_id, language_id = 22) - tr_res.common_content.code = file_name - tr_res.common_content.code_status = 4 - tr_res.common_content.code_user = request.user - tr_res.common_content.save() - - messages.success(request, 'Codefiles updated successfully!') - form = UpdateCodefilesForm() - except Exception as e: - print(e) - context = { - 'form': form, - } - context.update(csrf(request)) - return render(request, 'creation/templates/update_codefiles.html', context) + return HttpResponseRedirect('/creation/update-common-component/') @login_required def update_common_component(request): - #for codefiles, slides and additional material + # for codefiles, slides and additional material if not is_administrator(request.user): raise PermissionDenied() form = UpdateCommonCompForm() @@ -3668,49 +3718,47 @@ def update_common_component(request): form = UpdateCommonCompForm(request.POST, request.FILES) if form.is_valid(): try: - foss_id = request.POST.get('foss') + foss_id = form.cleaned_data.get('foss') foss = FossCategory.objects.get(pk=foss_id) - common_comp = request.POST.get('component_type') + common_comp = form.cleaned_data.get('component_type') - tutorial_detail_id = request.POST.get('tutorial') + tutorial_detail_id = form.cleaned_data.get('tutorial') tutorial = TutorialDetail.objects.get(pk=tutorial_detail_id) file_name, file_extension = os.path.splitext(request.FILES['comp'].name) - file_name = tutorial.tutorial.replace(' ', '-') + '-'+common_comp + file_extension - file_path = settings.MEDIA_ROOT + 'videos/' + str(foss_id) + '/' + str(tutorial_detail_id) + '/resources/' + file_name - - fout = open(file_path, 'wb+') - f = request.FILES['comp'] - # Iterate through the chunks. - for chunk in f.chunks(): - fout.write(chunk) - fout.close() - - tr_res = TutorialResource.objects.get(tutorial_detail=tutorial_detail_id, language_id = 22) - if common_comp == 'Codefiles': - tr_res.common_content.code = file_name - tr_res.common_content.code_status = 4 - tr_res.common_content.code_user = request.user - if common_comp == 'Slides': - tr_res.common_content.slide = file_name - tr_res.common_content.slide_status = 4 - tr_res.common_content.slide_user = request.user - if common_comp == 'Additionalmaterial': - tr_res.common_content.additional_material = file_name - tr_res.common_content.additional_material_status = 4 - tr_res.common_content.additional_material_user = request.user - tr_res.common_content.save() - - - - messages.success(request, common_comp+' updated successfully!') + file_name = tutorial.tutorial.replace(' ', '-') + '-' + common_comp + file_extension + file_path = os.path.join(settings.MEDIA_ROOT, 'videos', str(foss_id), str(tutorial_detail_id), 'resources', file_name) + os.makedirs(os.path.dirname(file_path), exist_ok=True) + + uploaded_file = request.FILES['comp'] + with open(file_path, 'wb+') as fout: + for chunk in uploaded_file.chunks(): + fout.write(chunk) + + tr_res = TutorialResource.objects.filter(tutorial_detail_id=tutorial_detail_id, language_id=22).select_related('common_content').first() + if tr_res and hasattr(tr_res, 'common_content') and tr_res.common_content: + if common_comp == 'Codefiles': + tr_res.common_content.code = file_name + tr_res.common_content.code_status = 4 + tr_res.common_content.code_user = request.user + elif common_comp == 'Slides': + tr_res.common_content.slide = file_name + tr_res.common_content.slide_status = 4 + tr_res.common_content.slide_user = request.user + elif common_comp == 'Additionalmaterial': + tr_res.common_content.additional_material = file_name + tr_res.common_content.additional_material_status = 4 + tr_res.common_content.additional_material_user = request.user + tr_res.common_content.save() + + messages.success(request, common_comp + ' updated successfully!') form = UpdateCommonCompForm() except Exception as e: - print(e) + logger.error("Error in update_common_component: %s", e) + messages.error(request, str(e)) context = { 'form': form, } - context.update(csrf(request)) return render(request, 'creation/templates/update_common_comp.html', context) @@ -3723,29 +3771,32 @@ def update_thumbnail(request): form = UpdateThumbnailForm(request.POST, request.FILES) if form.is_valid(): try: - foss_id = request.POST.get('foss') - foss = FossCategory.objects.get(pk = foss_id) - - tutorial_detail_id = request.POST.get('tutorial') - tutorial = TutorialDetail.objects.get(pk = tutorial_detail_id) - + foss_id = form.cleaned_data.get('foss') + foss = FossCategory.objects.get(pk=foss_id) - tr_res = TutorialResource.objects.get(tutorial_detail = tutorial_detail_id, language_id = 22) - tr_res.video_thumbnail_time = '00:' + request.POST.get('thumb_mins', '00') + ':' + request.POST.get('thumb_secs', '00') - tr_res.save() + tutorial_detail_id = form.cleaned_data.get('tutorial') + tutorial = TutorialDetail.objects.get(pk=tutorial_detail_id) - create_thumbnail(tr_res, 'Big', tr_res.video_thumbnail_time, '700:500') - create_thumbnail(tr_res, 'Small', tr_res.video_thumbnail_time, '170:127') + tr_res = TutorialResource.objects.filter(tutorial_detail_id=tutorial_detail_id, language_id=22).first() + if tr_res: + thumb_mins = form.cleaned_data.get('thumb_mins') or request.POST.get('thumb_mins', '00') + thumb_secs = form.cleaned_data.get('thumb_secs') or request.POST.get('thumb_secs', '00') + tr_res.video_thumbnail_time = '00:' + str(thumb_mins).zfill(2) + ':' + str(thumb_secs).zfill(2) + tr_res.save() + create_thumbnail(tr_res, 'Big', tr_res.video_thumbnail_time, '700:500') + create_thumbnail(tr_res, 'Small', tr_res.video_thumbnail_time, '170:127') - messages.success(request, 'create_thumbnail updated successfully!') - form = UpdateThumbnailForm() + messages.success(request, 'Thumbnail updated successfully!') + form = UpdateThumbnailForm() + else: + messages.error(request, 'English tutorial resource not found.') except Exception as e: - print(e) + logger.error("Error in update_thumbnail: %s", e) + messages.error(request, str(e)) context = { 'form': form, } - context.update(csrf(request)) return render(request, 'creation/templates/update_thumbnails.html', context) @@ -3844,7 +3895,7 @@ def allocate_tutorial(request, sel_status, role): global global_req global_req = request user = User.objects.get(id = request.user.id) - if not (user.is_authenticated() and + if not (user.is_authenticated and (is_contributor(user) or is_language_manager(request.user) or is_administrator(request.user))): raise PermissionDenied() @@ -5039,19 +5090,22 @@ def make_latex(certificate_path, file_name, content_tex): @csrf_exempt def add_details(request): form = DetailsForm() - context = {} - context['form']= form + context = {'form': form} if request.method == 'POST': my_dict = dict() - this_user = User.objects.get(id = request.POST.get('user')) - details = BankDetail.objects.filter(user=this_user).values( - 'account_name','account_number','ifsc','bank','branch','pincode', - 'pancard','bankaddress','vendor','vendoraddress') - if details: - my_dict = details[0] - print('-'*10,my_dict) - return HttpResponse(json.dumps(my_dict), content_type = 'application/json') - context.update(csrf(request)) + user_id = request.POST.get('user') + if user_id: + try: + this_user = User.objects.get(id=user_id) + details = BankDetail.objects.filter(user=this_user).values( + 'account_name', 'account_number', 'ifsc', 'bank', 'branch', 'pincode', + 'pancard', 'bankaddress', 'vendor', 'vendoraddress' + ) + if details: + my_dict = details[0] + except Exception as e: + logger.error("Error in add_details: %s", e) + return JsonResponse(my_dict, safe=False) return render(request, 'creation/templates/add_details.html', context) @csrf_exempt @@ -5062,51 +5116,57 @@ def save_details(request): form.save() messages.success(request, "Details saved successfully") else: - b_details = BankDetail.objects.get(user= request.POST.get('user')) - b_details.account_number = request.POST.get('account_number') - b_details.account_name = request.POST.get('account_name') - b_details.ifsc = request.POST.get('ifsc') - b_details.bank = request.POST.get('bank') - b_details.branch = request.POST.get('branch') - b_details.pincode = request.POST.get('pincode') - b_details.pancard = request.POST.get('pancard') - b_details.bankaddress = request.POST.get('bankaddress') - b_details.save() - messages.success(request, "Details updated !") + user_id = request.POST.get('user') + if user_id: + try: + b_details, _ = BankDetail.objects.get_or_create(user_id=user_id) + b_details.account_number = request.POST.get('account_number') + b_details.account_name = request.POST.get('account_name') + b_details.ifsc = request.POST.get('ifsc') + b_details.bank = request.POST.get('bank') + b_details.branch = request.POST.get('branch') + b_details.pincode = request.POST.get('pincode') + b_details.pancard = request.POST.get('pancard') + b_details.bankaddress = request.POST.get('bankaddress') + b_details.save() + messages.success(request, "Details updated !") + except Exception as e: + logger.error("Error saving bank details: %s", e) + messages.error(request, str(e)) return HttpResponseRedirect('/creation/add_details') @csrf_protect def file_checker(request, username, file_name): - filename = file_name+'.pdf' - fs = FileSystemStorage(location=settings.MEDIA_ROOT+DOCS+username) + filename = file_name + '.pdf' + fs = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT, DOCS, username)) if request.method == 'POST': - hono_id = int(file_name[11:16]) - hono_obj = PaymentHonorarium.objects.get(id=hono_id) - if fs.exists(fs.path(name='')+'/'+filename): - if request.POST['action'] == 'reject': - os.rename(fs.path(name='')+'/'+filename, - fs.path(name='')+'/'+file_name+'_rejected.pdf') - return HttpResponse('deleted') - if request.POST['action'] == 'accept': - os.rename(fs.path(name='')+'/'+filename, - fs.path(name='')+'/'+file_name+'_accepted.pdf') - if 'agreement' in file_name: - if hono_obj.status == 6: - hono_obj.status = 11 - else: - hono_obj.status = 5 - if 'receipt' in file_name: - if hono_obj.status == 5: - hono_obj.status = 11 - else: - hono_obj.status = 6 - hono_obj.save() - return HttpResponse('accepted') + try: + hono_id = int(file_name[11:16]) + hono_obj = PaymentHonorarium.objects.get(id=hono_id) + if fs.exists(filename): + if request.POST.get('action') == 'reject': + os.rename(fs.path(filename), fs.path(file_name + '_rejected.pdf')) + return HttpResponse('deleted') + if request.POST.get('action') == 'accept': + os.rename(fs.path(filename), fs.path(file_name + '_accepted.pdf')) + if 'agreement' in file_name: + if hono_obj.status == 6: + hono_obj.status = 11 + else: + hono_obj.status = 5 + if 'receipt' in file_name: + if hono_obj.status == 5: + hono_obj.status = 11 + else: + hono_obj.status = 6 + hono_obj.save() + return HttpResponse('accepted') + except Exception as e: + logger.error("Error in file_checker POST: %s", e) else: - with fs.open(filename) as pdf: - response = HttpResponse(pdf, content_type='application/pdf') - response['Content-Disposition'] = 'attachment; \ - filename=%s' % (file_name+'.pdf') - response.write(pdf) + if fs.exists(filename): + pdf = fs.open(filename) + response = FileResponse(pdf, content_type='application/pdf') + response['Content-Disposition'] = f'attachment; filename={file_name}.pdf' return response - return Http404 \ No newline at end of file + raise Http404("File not found") \ No newline at end of file diff --git a/donate/models.py b/donate/models.py index 6a8ce027c..78fdb62fc 100644 --- a/donate/models.py +++ b/donate/models.py @@ -74,8 +74,8 @@ def is_past_due(self): class CdFossLanguages(models.Model): payment = models.ForeignKey(Payee, on_delete=models.PROTECT) foss = models.ForeignKey(FossCategory, on_delete=models.PROTECT,related_name="payment_foss") - lang = models.ForeignKey(Language) - level = models.ForeignKey(Level,null=True,blank=True) + lang = models.ForeignKey(Language, on_delete=models.PROTECT) + level = models.ForeignKey(Level, null=True, blank=True, on_delete=models.PROTECT) class PaymentTransaction(models.Model): paymentdetail = models.ForeignKey(Payee, on_delete=models.PROTECT, related_name="payment_transaction" ) diff --git a/donate/payment.py b/donate/payment.py index cf67c5f72..b3bdd13d1 100644 --- a/donate/payment.py +++ b/donate/payment.py @@ -1,4 +1,4 @@ -from django.core.urlresolvers import reverse +from django.urls import reverse from django.conf import settings from django.views.decorators.csrf import csrf_exempt diff --git a/donate/subscription.py b/donate/subscription.py index 346b2e80d..fda625894 100644 --- a/donate/subscription.py +++ b/donate/subscription.py @@ -1,5 +1,5 @@ from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from events.models import AcademicCenter, \ AcademicKey, AcademicPaymentStatus, Organiser, StudentMaster from .models import AcademicSubscription, HDFCTransactionDetails, AcademicSubscriptionDetail, CdFossLanguages, PaymentTransaction diff --git a/events/decorators.py b/events/decorators.py index eae6e3934..344633033 100644 --- a/events/decorators.py +++ b/events/decorators.py @@ -1,10 +1,9 @@ from functools import wraps +from urllib.parse import urlparse from django.conf import settings from django.contrib import messages from django.shortcuts import resolve_url -from django.utils.decorators import available_attrs from django.contrib.auth import REDIRECT_FIELD_NAME -from django.utils.six.moves.urllib.parse import urlparse from events.views import is_organiser default_message = "You don't have enough permission to view this page." @@ -13,7 +12,7 @@ def user_passes_test(test_func, login_url=None, \ redirect_field_name=REDIRECT_FIELD_NAME): def decorator(view_func): - @wraps(view_func, assigned=available_attrs(view_func)) + @wraps(view_func) def _wrapped_view(request, *args, **kwargs): if test_func(request): return view_func(request, *args, **kwargs) @@ -34,7 +33,7 @@ def _wrapped_view(request, *args, **kwargs): def group_required(*group_names): def in_groups(request): - if request.user.is_authenticated(): + if request.user.is_authenticated: if 'Organiser' in group_names: if bool(request.user.groups.filter(name__in=group_names)) and is_organiser(request.user): return True diff --git a/events/migrations/0001_initial.py b/events/migrations/0001_initial.py index 37c598356..4bd5bb5f1 100644 --- a/events/migrations/0001_initial.py +++ b/events/migrations/0001_initial.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion from django.conf import settings @@ -96,8 +97,8 @@ class Migration(migrations.Migration): ('status', models.PositiveSmallIntegerField(default=0)), ('message', models.CharField(max_length=255)), ('created', models.DateTimeField(auto_now_add=True)), - ('academic', models.ForeignKey(to='events.AcademicCenter')), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('academic', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.AcademicCenter')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -106,7 +107,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('mdlcourse_id', models.PositiveIntegerField()), ('mdlquiz_id', models.PositiveIntegerField()), - ('foss', models.ForeignKey(to='creation.FossCategory')), + ('foss', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.FossCategory')), ], ), migrations.CreateModel( @@ -137,9 +138,9 @@ class Migration(migrations.Migration): ('status', models.PositiveSmallIntegerField(default=0)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('academic', models.ForeignKey(to='events.AcademicCenter')), - ('appoved_by', models.ForeignKey(related_name='invigilator_approved_by', blank=True, to=settings.AUTH_USER_MODEL, null=True)), - ('user', models.OneToOneField(to=settings.AUTH_USER_MODEL)), + ('academic', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.AcademicCenter')), + ('appoved_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='invigilator_approved_by', blank=True, to=settings.AUTH_USER_MODEL, null=True)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -159,7 +160,7 @@ class Migration(migrations.Migration): ('pincode', models.PositiveIntegerField()), ('created', models.DateTimeField(auto_now_add=True, null=True)), ('updated', models.DateTimeField(auto_now=True)), - ('district', models.ForeignKey(to='events.District')), + ('district', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.District')), ], ), migrations.CreateModel( @@ -169,16 +170,16 @@ class Migration(migrations.Migration): ('status', models.PositiveSmallIntegerField(default=0)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('academic', models.ForeignKey(blank=True, to='events.AcademicCenter', null=True)), - ('appoved_by', models.ForeignKey(related_name='organiser_approved_by', blank=True, to=settings.AUTH_USER_MODEL, null=True)), - ('user', models.OneToOneField(related_name='organiser', to=settings.AUTH_USER_MODEL)), + ('academic', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, blank=True, to='events.AcademicCenter', null=True)), + ('appoved_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='organiser_approved_by', blank=True, to=settings.AUTH_USER_MODEL, null=True)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='organiser', to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( name='OrganiserNotification', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -187,10 +188,10 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('assigned_by', models.ForeignKey(related_name='permission_assigned_by', to=settings.AUTH_USER_MODEL)), - ('district', models.ForeignKey(related_name='permission_district', to='events.District', null=True)), - ('institute', models.ForeignKey(related_name='permission_district', to='events.AcademicCenter', null=True)), - ('institute_type', models.ForeignKey(related_name='permission_institution_type', to='events.InstituteType', null=True)), + ('assigned_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='permission_assigned_by', to=settings.AUTH_USER_MODEL)), + ('district', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='permission_district', to='events.District', null=True)), + ('institute', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='permission_district', to='events.AcademicCenter', null=True)), + ('institute_type', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='permission_institution_type', to='events.InstituteType', null=True)), ], ), migrations.CreateModel( @@ -234,10 +235,10 @@ class Migration(migrations.Migration): ('participant_count', models.PositiveIntegerField(default=0)), ('created', models.DateTimeField()), ('updated', models.DateTimeField()), - ('academic', models.ForeignKey(to='events.AcademicCenter')), - ('course', models.ForeignKey(to='events.CourseMap')), - ('language', models.ForeignKey(to='creation.Language')), - ('organiser', models.ForeignKey(to='events.Organiser')), + ('academic', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.AcademicCenter')), + ('course', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.CourseMap')), + ('language', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.Language')), + ('organiser', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Organiser')), ], ), migrations.CreateModel( @@ -253,7 +254,7 @@ class Migration(migrations.Migration): ('status', models.PositiveSmallIntegerField(default=0)), ('created', models.DateTimeField()), ('updated', models.DateTimeField()), - ('training', models.ForeignKey(to='events.SingleTraining')), + ('training', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.SingleTraining')), ], ), migrations.CreateModel( @@ -280,7 +281,7 @@ class Migration(migrations.Migration): ('error', models.BooleanField(default=False)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('user', models.OneToOneField(to=settings.AUTH_USER_MODEL)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -289,9 +290,9 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('year', models.PositiveIntegerField()), ('stcount', models.PositiveIntegerField(default=0)), - ('academic', models.ForeignKey(to='events.AcademicCenter')), - ('department', models.ForeignKey(to='events.Department')), - ('organiser', models.ForeignKey(to='events.Organiser')), + ('academic', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.AcademicCenter')), + ('department', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Department')), + ('organiser', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Organiser')), ], ), migrations.CreateModel( @@ -301,8 +302,8 @@ class Migration(migrations.Migration): ('moved', models.BooleanField(default=False)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('batch', models.ForeignKey(to='events.StudentBatch')), - ('student', models.ForeignKey(to='events.Student')), + ('batch', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.StudentBatch')), + ('student', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Student')), ], ), migrations.CreateModel( @@ -316,12 +317,12 @@ class Migration(migrations.Migration): ('participant_count', models.PositiveIntegerField(default=0)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('academic', models.ForeignKey(to='events.AcademicCenter')), - ('appoved_by', models.ForeignKey(related_name='test_approved_by', to=settings.AUTH_USER_MODEL, null=True)), + ('academic', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.AcademicCenter')), + ('appoved_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='test_approved_by', to=settings.AUTH_USER_MODEL, null=True)), ('department', models.ManyToManyField(to='events.Department')), - ('foss', models.ForeignKey(to='creation.FossCategory')), - ('invigilator', models.ForeignKey(related_name='test_invigilator', to='events.Invigilator', null=True)), - ('organiser', models.ForeignKey(related_name='test_organiser', to='events.Organiser')), + ('foss', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.FossCategory')), + ('invigilator', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='test_invigilator', to='events.Invigilator', null=True)), + ('organiser', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='test_organiser', to='events.Organiser')), ], options={ 'verbose_name': 'Test Categorie', @@ -342,7 +343,7 @@ class Migration(migrations.Migration): ('status', models.PositiveSmallIntegerField(default=0)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('test', models.ForeignKey(to='events.Test')), + ('test', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Test')), ], options={ 'verbose_name': 'Test Attendance', @@ -371,8 +372,8 @@ class Migration(migrations.Migration): ('status', models.PositiveSmallIntegerField(default=0)), ('created', models.DateTimeField(auto_now_add=True, null=True)), ('updated', models.DateTimeField(auto_now=True, null=True)), - ('approved_by', models.ForeignKey(related_name='testimonial_approved_by', to=settings.AUTH_USER_MODEL, null=True)), - ('user', models.ForeignKey(related_name='testimonial_created_by', to=settings.AUTH_USER_MODEL)), + ('approved_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='testimonial_approved_by', to=settings.AUTH_USER_MODEL, null=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='testimonial_created_by', to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -382,9 +383,9 @@ class Migration(migrations.Migration): ('role', models.PositiveSmallIntegerField(default=0)), ('status', models.PositiveSmallIntegerField(default=0)), ('created', models.DateTimeField(auto_now_add=True)), - ('academic', models.ForeignKey(to='events.AcademicCenter')), - ('test', models.ForeignKey(to='events.Test')), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('academic', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.AcademicCenter')), + ('test', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Test')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -401,9 +402,9 @@ class Migration(migrations.Migration): ('trusted', models.BooleanField(default=1)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('academic', models.ForeignKey(to='events.AcademicCenter')), - ('appoved_by', models.ForeignKey(related_name='training_approved_by', to=settings.AUTH_USER_MODEL, null=True)), - ('course', models.ForeignKey(to='events.Course')), + ('academic', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.AcademicCenter')), + ('appoved_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='training_approved_by', to=settings.AUTH_USER_MODEL, null=True)), + ('course', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Course')), ('department', models.ManyToManyField(to='events.Department')), ], ), @@ -413,8 +414,8 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('language', models.ForeignKey(default=None, to='creation.Language')), - ('student', models.ForeignKey(to='events.Student')), + ('language', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, default=None, to='creation.Language')), + ('student', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Student')), ], ), migrations.CreateModel( @@ -431,7 +432,7 @@ class Migration(migrations.Migration): ('status', models.PositiveSmallIntegerField(default=0)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('training', models.ForeignKey(to='events.Training')), + ('training', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Training')), ], options={ 'verbose_name': 'Training Attendance', @@ -444,7 +445,7 @@ class Migration(migrations.Migration): ('password', models.CharField(max_length=255, null=True)), ('count', models.PositiveSmallIntegerField(default=0)), ('updated', models.DateTimeField()), - ('student', models.ForeignKey(to='events.Student')), + ('student', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Student')), ], ), migrations.CreateModel( @@ -500,7 +501,7 @@ class Migration(migrations.Migration): ('reason_why', models.TextField()), ('other_comments', models.TextField()), ('created', models.DateTimeField(auto_now_add=True)), - ('training', models.ForeignKey(to='events.Training')), + ('training', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Training')), ], ), migrations.CreateModel( @@ -553,8 +554,8 @@ class Migration(migrations.Migration): ('side_by_side_method_is_effective', models.PositiveIntegerField(default=0)), ('side_by_side_method_is', models.PositiveIntegerField(default=0)), ('created', models.DateTimeField(auto_now_add=True)), - ('language_prefered', models.ForeignKey(to='creation.Language', null=True)), - ('training', models.ForeignKey(to='events.Training')), + ('language_prefered', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.Language', null=True)), + ('training', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Training')), ], ), migrations.CreateModel( @@ -600,7 +601,7 @@ class Migration(migrations.Migration): ('reason_why', models.TextField()), ('other_comments', models.TextField()), ('created', models.DateTimeField(auto_now_add=True)), - ('training', models.ForeignKey(to='events.Training')), + ('training', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Training')), ], ), migrations.CreateModel( @@ -610,9 +611,9 @@ class Migration(migrations.Migration): ('role', models.PositiveSmallIntegerField()), ('status', models.PositiveSmallIntegerField()), ('created', models.DateTimeField(auto_now_add=True)), - ('academic', models.ForeignKey(to='events.AcademicCenter')), - ('training', models.ForeignKey(to='events.Training')), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('academic', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.AcademicCenter')), + ('training', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Training')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -622,9 +623,9 @@ class Migration(migrations.Migration): ('year', models.CharField(max_length=50)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('academic', models.ForeignKey(to='events.AcademicCenter')), - ('organiser', models.ForeignKey(to='events.Organiser')), - ('semester', models.ForeignKey(to='events.Semester')), + ('academic', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.AcademicCenter')), + ('organiser', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Organiser')), + ('semester', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Semester')), ], ), migrations.CreateModel( @@ -636,10 +637,10 @@ class Migration(migrations.Migration): ('status', models.BooleanField(default=0)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('batch', models.ForeignKey(to='events.StudentBatch', null=True)), - ('course', models.ForeignKey(to='events.CourseMap')), - ('department', models.ForeignKey(to='events.Department')), - ('training_planner', models.ForeignKey(to='events.TrainingPlanner')), + ('batch', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.StudentBatch', null=True)), + ('course', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.CourseMap')), + ('department', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Department')), + ('training_planner', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.TrainingPlanner')), ], ), migrations.CreateModel( @@ -649,79 +650,79 @@ class Migration(migrations.Migration): ('name', models.CharField(max_length=200)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('state', models.ForeignKey(to='events.State')), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('state', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.State')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), migrations.AddField( model_name='trainingcertificate', name='training', - field=models.ForeignKey(to='events.TrainingRequest'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.TrainingRequest'), ), migrations.AddField( model_name='trainingattend', name='training', - field=models.ForeignKey(to='events.TrainingRequest'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.TrainingRequest'), ), migrations.AddField( model_name='training', name='extra_fields', - field=models.OneToOneField(null=True, to='events.TrainingExtraFields'), + field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, null=True, to='events.TrainingExtraFields'), ), migrations.AddField( model_name='training', name='foss', - field=models.ForeignKey(to='creation.FossCategory'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.FossCategory'), ), migrations.AddField( model_name='training', name='language', - field=models.ForeignKey(to='creation.Language'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.Language'), ), migrations.AddField( model_name='training', name='organiser', - field=models.ForeignKey(to='events.Organiser'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Organiser'), ), migrations.AddField( model_name='test', name='test_category', - field=models.ForeignKey(related_name='test_category', to='events.TestCategory'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='test_category', to='events.TestCategory'), ), migrations.AddField( model_name='test', name='training', - field=models.ForeignKey(to='events.Training', null=True), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Training', null=True), ), migrations.AddField( model_name='resourceperson', name='state', - field=models.ForeignKey(to='events.State'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.State'), ), migrations.AddField( model_name='resourceperson', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AddField( model_name='permission', name='permissiontype', - field=models.ForeignKey(to='events.PermissionType'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.PermissionType'), ), migrations.AddField( model_name='permission', name='state', - field=models.ForeignKey(related_name='permission_state', to='events.State'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='permission_state', to='events.State'), ), migrations.AddField( model_name='permission', name='university', - field=models.ForeignKey(related_name='permission_iniversity', to='events.University', null=True), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='permission_iniversity', to='events.University', null=True), ), migrations.AddField( model_name='permission', name='user', - field=models.ForeignKey(related_name='permission_user', to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='permission_user', to=settings.AUTH_USER_MODEL), ), migrations.AlterUniqueTogether( name='institutetype', @@ -730,17 +731,17 @@ class Migration(migrations.Migration): migrations.AddField( model_name='district', name='state', - field=models.ForeignKey(to='events.State'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.State'), ), migrations.AddField( model_name='coursemap', name='course', - field=models.ForeignKey(blank=True, to='events.LabCourse', null=True), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, blank=True, to='events.LabCourse', null=True), ), migrations.AddField( model_name='coursemap', name='foss', - field=models.ForeignKey(to='creation.FossCategory'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.FossCategory'), ), migrations.AlterUniqueTogether( name='course', @@ -749,47 +750,47 @@ class Migration(migrations.Migration): migrations.AddField( model_name='city', name='state', - field=models.ForeignKey(to='events.State'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.State'), ), migrations.AddField( model_name='academiccenter', name='city', - field=models.ForeignKey(to='events.City'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.City'), ), migrations.AddField( model_name='academiccenter', name='district', - field=models.ForeignKey(to='events.District'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.District'), ), migrations.AddField( model_name='academiccenter', name='institute_category', - field=models.ForeignKey(to='events.InstituteCategory'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.InstituteCategory'), ), migrations.AddField( model_name='academiccenter', name='institution_type', - field=models.ForeignKey(to='events.InstituteType'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.InstituteType'), ), migrations.AddField( model_name='academiccenter', name='location', - field=models.ForeignKey(to='events.Location', null=True), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Location', null=True), ), migrations.AddField( model_name='academiccenter', name='state', - field=models.ForeignKey(to='events.State'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.State'), ), migrations.AddField( model_name='academiccenter', name='university', - field=models.ForeignKey(to='events.University'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.University'), ), migrations.AddField( model_name='academiccenter', name='user', - field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), ), migrations.AlterUniqueTogether( name='university', diff --git a/events/migrations/0002_auto_20150623_1627.py b/events/migrations/0002_auto_20150623_1627.py index aa9fa9710..0c5dff884 100644 --- a/events/migrations/0002_auto_20150623_1627.py +++ b/events/migrations/0002_auto_20150623_1627.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion class Migration(migrations.Migration): @@ -14,6 +15,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='test', name='training', - field=models.ForeignKey(to='events.TrainingRequest', null=True), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.TrainingRequest', null=True), ), ] diff --git a/events/migrations/0003_testattendance_student.py b/events/migrations/0003_testattendance_student.py index 3cfc1a518..18e16a1b9 100644 --- a/events/migrations/0003_testattendance_student.py +++ b/events/migrations/0003_testattendance_student.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion class Migration(migrations.Migration): @@ -14,6 +15,6 @@ class Migration(migrations.Migration): migrations.AddField( model_name='testattendance', name='student', - field=models.ForeignKey(to='events.Student', null=True), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Student', null=True), ), ] diff --git a/events/migrations/0005_auto_20150731_1230.py b/events/migrations/0005_auto_20150731_1230.py index b9cb723cd..1d4082698 100644 --- a/events/migrations/0005_auto_20150731_1230.py +++ b/events/migrations/0005_auto_20150731_1230.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion class Migration(migrations.Migration): @@ -14,6 +15,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='trainingfeedback', name='training', - field=models.ForeignKey(to='events.TrainingRequest'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.TrainingRequest'), ), ] diff --git a/events/migrations/0006_auto_20150731_1340.py b/events/migrations/0006_auto_20150731_1340.py index 9d478a278..4b27b9053 100644 --- a/events/migrations/0006_auto_20150731_1340.py +++ b/events/migrations/0006_auto_20150731_1340.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion class Migration(migrations.Migration): @@ -14,6 +15,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='traininglanguagefeedback', name='training', - field=models.ForeignKey(to='events.TrainingRequest'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.TrainingRequest'), ), ] diff --git a/events/migrations/0008_auto_20150731_1648.py b/events/migrations/0008_auto_20150731_1648.py index 54e1f9d38..d84df00d0 100644 --- a/events/migrations/0008_auto_20150731_1648.py +++ b/events/migrations/0008_auto_20150731_1648.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion class Migration(migrations.Migration): @@ -14,6 +15,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='traininglivefeedback', name='training', - field=models.ForeignKey(to='events.SingleTraining'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.SingleTraining'), ), ] diff --git a/events/migrations/0009_auto_20150806_1820.py b/events/migrations/0009_auto_20150806_1820.py index 580d618ac..30748611f 100644 --- a/events/migrations/0009_auto_20150806_1820.py +++ b/events/migrations/0009_auto_20150806_1820.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion class Migration(migrations.Migration): @@ -52,12 +53,12 @@ class Migration(migrations.Migration): ('testimonial', models.CharField(max_length=500)), ('any_other_suggestions', models.CharField(max_length=500)), ('can_contact', models.CharField(max_length=10, choices=[(b'', b'-----'), (b'0', b'Yes'), (b'1', b'No')])), - ('city', models.ForeignKey(to='events.City')), - ('district', models.ForeignKey(to='events.District')), + ('city', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.City')), + ('district', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.District')), ('helpful_for', models.ManyToManyField(related_name='events_HelpfulFor_related', to='events.HelpfulFor')), ('language', models.ManyToManyField(related_name='events_Language_related', to='creation.Language')), ('offered_training_foss', models.ManyToManyField(related_name='events_FossCategory_related', to='creation.FossCategory')), - ('state', models.ForeignKey(to='events.State')), + ('state', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.State')), ], ), migrations.CreateModel( @@ -80,6 +81,6 @@ class Migration(migrations.Migration): migrations.AddField( model_name='organiserfeedback', name='university', - field=models.ForeignKey(to='events.AcademicCenter'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.AcademicCenter'), ), ] diff --git a/events/migrations/0012_auto_20150908_1722.py b/events/migrations/0012_auto_20150908_1722.py index 2968b3e19..ae949faa4 100644 --- a/events/migrations/0012_auto_20150908_1722.py +++ b/events/migrations/0012_auto_20150908_1722.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion class Migration(migrations.Migration): @@ -14,12 +15,12 @@ class Migration(migrations.Migration): migrations.AddField( model_name='singletraining', name='institution_type', - field=models.ForeignKey(to='events.InstituteType', null=True), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.InstituteType', null=True), ), migrations.AddField( model_name='singletraining', name='state', - field=models.ForeignKey(to='events.State', null=True), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.State', null=True), ), migrations.AddField( model_name='singletraining', diff --git a/events/migrations/0015_stworkshopfeedback_stworkshopfeedbackpost_stworkshopfeedbackpre.py b/events/migrations/0015_stworkshopfeedback_stworkshopfeedbackpost_stworkshopfeedbackpre.py index 8d8ed02df..7107bf771 100644 --- a/events/migrations/0015_stworkshopfeedback_stworkshopfeedbackpost_stworkshopfeedbackpre.py +++ b/events/migrations/0015_stworkshopfeedback_stworkshopfeedbackpost_stworkshopfeedbackpre.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion from django.conf import settings @@ -168,7 +169,7 @@ class Migration(migrations.Migration): ('how_make_better', models.CharField(max_length=500)), ('experience', models.CharField(max_length=500)), ('suggestions', models.CharField(max_length=500)), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -199,7 +200,7 @@ class Migration(migrations.Migration): ('installig_ad_themes', models.CharField(max_length=50, choices=[(b'', b'-----'), (b'Notconfidentatall', b'Not confident at all'), (b'Unconfident', b'Unconfident'), (b'Neitherconfidentnorunconfident', b'Neither confident nor unconfident'), (b'Confident', b'Confident'), (b'Absolutelyconfident', b'Absolutely confident'), (b'NotApplicable', b'Not Applicable')])), ('people_management', models.CharField(max_length=50, choices=[(b'', b'-----'), (b'Notconfidentatall', b'Not confident at all'), (b'Unconfident', b'Unconfident'), (b'Neitherconfidentnorunconfident', b'Neither confident nor unconfident'), (b'Confident', b'Confident'), (b'Absolutelyconfident', b'Absolutely confident'), (b'NotApplicable', b'Not Applicable')])), ('site_management', models.CharField(max_length=50, choices=[(b'', b'-----'), (b'Notconfidentatall', b'Not confident at all'), (b'Unconfident', b'Unconfident'), (b'Neitherconfidentnorunconfident', b'Neither confident nor unconfident'), (b'Confident', b'Confident'), (b'Absolutelyconfident', b'Absolutely confident'), (b'NotApplicable', b'Not Applicable')])), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), ] diff --git a/events/migrations/0018_auto_20170615_1654.py b/events/migrations/0018_auto_20170615_1654.py index 03853e50d..c4791de26 100644 --- a/events/migrations/0018_auto_20170615_1654.py +++ b/events/migrations/0018_auto_20170615_1654.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion import datetime from django.utils.timezone import utc @@ -62,7 +63,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='stworkshopfeedback', name='foss', - field=models.ForeignKey(default=22, to='creation.FossCategory'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, default=22, to='creation.FossCategory'), preserve_default=False, ), migrations.AddField( diff --git a/events/migrations/0020_inductioninterest.py b/events/migrations/0020_inductioninterest.py index f745673f1..bcfe54dfd 100644 --- a/events/migrations/0020_inductioninterest.py +++ b/events/migrations/0020_inductioninterest.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion class Migration(migrations.Migration): @@ -38,8 +39,8 @@ class Migration(migrations.Migration): ('do_agree', models.CharField(max_length=50, choices=[(b'', b'-----'), (b'Yes', b'Yes'), (b'No', b'No')])), ('no_objection', models.CharField(max_length=50, choices=[(b'', b'-----'), (b'Yes', b'Yes'), (b'No', b'No')])), ('other_comments', models.CharField(max_length=500)), - ('city', models.ForeignKey(to='events.City')), - ('state', models.ForeignKey(to='events.State')), + ('city', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.City')), + ('state', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.State')), ], ), ] diff --git a/events/migrations/0027_inductionfinallist.py b/events/migrations/0027_inductionfinallist.py index 23f82c634..007e7a487 100644 --- a/events/migrations/0027_inductionfinallist.py +++ b/events/migrations/0027_inductionfinallist.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion class Migration(migrations.Migration): @@ -19,7 +20,7 @@ class Migration(migrations.Migration): ('code', models.CharField(default=None, max_length=255)), ('batch_code', models.PositiveIntegerField()), ('created', models.DateTimeField(auto_now_add=True)), - ('eoi_id', models.ForeignKey(default=None, to='events.InductionInterest')), + ('eoi_id', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, default=None, to='events.InductionInterest')), ], ), ] diff --git a/events/migrations/0029_mumbaistudents.py b/events/migrations/0029_mumbaistudents.py index c32acdee5..32e29b773 100644 --- a/events/migrations/0029_mumbaistudents.py +++ b/events/migrations/0029_mumbaistudents.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion class Migration(migrations.Migration): @@ -15,8 +16,8 @@ class Migration(migrations.Migration): name='MumbaiStudents', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('bid', models.ForeignKey(to='events.StudentBatch')), - ('stuid', models.ForeignKey(to='events.Student')), + ('bid', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.StudentBatch')), + ('stuid', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Student')), ], ), ] diff --git a/events/migrations/0030_accountexecutive.py b/events/migrations/0030_accountexecutive.py index 59437028f..f9347cbf7 100644 --- a/events/migrations/0030_accountexecutive.py +++ b/events/migrations/0030_accountexecutive.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion from django.conf import settings @@ -20,9 +21,9 @@ class Migration(migrations.Migration): ('status', models.PositiveSmallIntegerField(default=0)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('academic', models.ForeignKey(blank=True, to='events.AcademicCenter', null=True)), - ('appoved_by', models.ForeignKey(related_name='accountexecutive_approved_by', blank=True, to=settings.AUTH_USER_MODEL, null=True)), - ('user', models.OneToOneField(related_name='accountexecutive', to=settings.AUTH_USER_MODEL)), + ('academic', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, blank=True, to='events.AcademicCenter', null=True)), + ('appoved_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='accountexecutive_approved_by', blank=True, to=settings.AUTH_USER_MODEL, null=True)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='accountexecutive', to=settings.AUTH_USER_MODEL)), ], ), ] diff --git a/events/migrations/0031_auto_20180720_1500.py b/events/migrations/0031_auto_20180720_1500.py index f979d9978..b982c77fd 100644 --- a/events/migrations/0031_auto_20180720_1500.py +++ b/events/migrations/0031_auto_20180720_1500.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion from django.conf import settings @@ -24,8 +25,8 @@ class Migration(migrations.Migration): ('gstno', models.CharField(max_length=15, null=True)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now_add=True)), - ('academic_id', models.ForeignKey(to='events.AcademicCenter')), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('academic_id', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.AcademicCenter')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ('academic_year', models.PositiveIntegerField()), ], ), diff --git a/events/migrations/0032_paymenttransactiondetails.py b/events/migrations/0032_paymenttransactiondetails.py index cf927a1eb..791d9a91c 100644 --- a/events/migrations/0032_paymenttransactiondetails.py +++ b/events/migrations/0032_paymenttransactiondetails.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion from django.conf import settings @@ -27,8 +28,8 @@ class Migration(migrations.Migration): ('msg', models.CharField(max_length=100)), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now_add=True)), - ('paymentdetail', models.ForeignKey(to='events.PaymentDetails')), - ('userId', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ('paymentdetail', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.PaymentDetails')), + ('userId', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], ), ] diff --git a/events/migrations/0036_auto_20180824_1241.py b/events/migrations/0036_auto_20180824_1241.py index e8916c424..56b8abe1f 100644 --- a/events/migrations/0036_auto_20180824_1241.py +++ b/events/migrations/0036_auto_20180824_1241.py @@ -2,6 +2,7 @@ from django.db import models, migrations +import django.db.models.deletion class Migration(migrations.Migration): @@ -20,7 +21,7 @@ class Migration(migrations.Migration): ('user', models.CharField(max_length=255)), ('content', models.CharField(max_length=255)), ('created', models.DateTimeField(auto_now_add=True)), - ('foss', models.ForeignKey(to='creation.FossCategory')), + ('foss', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='creation.FossCategory')), ], options={ 'verbose_name': 'Media Testimonials', diff --git a/events/models.py b/events/models.py index e7acc0073..7fc56347e 100755 --- a/events/models.py +++ b/events/models.py @@ -6,7 +6,7 @@ from django.db.models.signals import pre_delete, post_delete from django.dispatch import receiver from django.db.models import Q, Count, Sum, Min -from django.utils.encoding import python_2_unicode_compatible +from six import python_2_unicode_compatible from creation.models import FossCategory, Language, Level diff --git a/forums/migrations/0001_initial.py b/forums/migrations/0001_initial.py new file mode 100644 index 000000000..389f4b033 --- /dev/null +++ b/forums/migrations/0001_initial.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2026-07-21 12:21 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Answer', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('uid', models.IntegerField()), + ('body', models.TextField()), + ('date_created', models.DateTimeField(auto_now_add=True)), + ('date_modified', models.DateTimeField(auto_now=True)), + ], + options={ + 'db_table': 'website_answer', + }, + ), + migrations.CreateModel( + name='AnswerComment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('uid', models.IntegerField()), + ('body', models.TextField()), + ('date_created', models.DateTimeField(auto_now_add=True)), + ('date_modified', models.DateTimeField(auto_now=True)), + ('answer', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='forums.Answer')), + ], + options={ + 'db_table': 'website_answercomment', + }, + ), + migrations.CreateModel( + name='AnswerVote', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('uid', models.IntegerField()), + ('answer', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='forums.Answer')), + ], + options={ + 'db_table': 'website_answervote', + }, + ), + migrations.CreateModel( + name='Notification', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('uid', models.IntegerField()), + ('pid', models.IntegerField()), + ('qid', models.IntegerField()), + ('aid', models.IntegerField(default=0)), + ('cid', models.IntegerField(default=0)), + ('date_created', models.DateTimeField(auto_now_add=True)), + ], + options={ + 'db_table': 'website_notification', + }, + ), + migrations.CreateModel( + name='Question', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('uid', models.IntegerField()), + ('category', models.CharField(max_length=200)), + ('tutorial', models.CharField(max_length=200)), + ('minute_range', models.CharField(max_length=10)), + ('second_range', models.CharField(max_length=10)), + ('title', models.CharField(max_length=200)), + ('body', models.TextField()), + ('date_created', models.DateTimeField(auto_now_add=True)), + ('date_modified', models.DateTimeField(auto_now=True)), + ('views', models.IntegerField(default=1)), + ('status', models.IntegerField(default=1)), + ], + options={ + 'db_table': 'website_question', + 'get_latest_by': 'date_created', + }, + ), + migrations.CreateModel( + name='QuestionComment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('uid', models.IntegerField()), + ('body', models.TextField()), + ('date_created', models.DateTimeField(auto_now_add=True)), + ('date_modified', models.DateTimeField(auto_now=True)), + ('question', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='forums.Question')), + ], + options={ + 'db_table': 'website_questioncomment', + }, + ), + migrations.CreateModel( + name='QuestionVote', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('uid', models.IntegerField()), + ('question', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='forums.Question')), + ], + options={ + 'db_table': 'website_questionvote', + }, + ), + migrations.AddField( + model_name='answer', + name='question', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='forums.Question'), + ), + ] diff --git a/health_app/migrations/0001_initial.py b/health_app/migrations/0001_initial.py new file mode 100644 index 000000000..00fbf6bb9 --- /dev/null +++ b/health_app/migrations/0001_initial.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2026-07-21 12:21 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Category', + fields=[ + ('category_id', models.IntegerField(primary_key=True, serialize=False)), + ('category_name', models.CharField(max_length=255)), + ('date_added', models.DateTimeField()), + ('description', models.CharField(max_length=2000)), + ('image_path', models.CharField(max_length=255)), + ('status', models.TextField()), + ('user_id', models.BigIntegerField(blank=True, null=True)), + ('order_value', models.IntegerField()), + ], + options={ + 'db_table': 'category', + 'managed': False, + }, + ), + migrations.CreateModel( + name='HNContributorRole', + fields=[ + ('id', models.IntegerField(primary_key=True, serialize=False)), + ('date_added', models.DateTimeField(blank=True, null=True)), + ('language_id', models.IntegerField(blank=True, null=True)), + ('topic_cat_id', models.IntegerField(blank=True, null=True)), + ], + options={ + 'db_table': 'contributor_role', + 'managed': False, + }, + ), + migrations.CreateModel( + name='HNLanguage', + fields=[ + ('lan_id', models.IntegerField(primary_key=True, serialize=False)), + ('date_added', models.DateTimeField()), + ('lang_name', models.CharField(max_length=255)), + ('status', models.TextField()), + ('user_id', models.BigIntegerField(blank=True, null=True)), + ], + options={ + 'db_table': 'language', + 'managed': False, + }, + ), + migrations.CreateModel( + name='TopicCategory', + fields=[ + ('topic_category_id', models.IntegerField(primary_key=True, serialize=False)), + ('order_value', models.IntegerField(blank=True, null=True)), + ('status', models.TextField()), + ('category_id', models.IntegerField(blank=True, null=True)), + ('topic_id', models.IntegerField(blank=True, null=True)), + ], + options={ + 'db_table': 'topic_category', + 'managed': False, + }, + ), + ] diff --git a/mdldjango/migrations/0003_auto_20260721_1751.py b/mdldjango/migrations/0003_auto_20260721_1751.py new file mode 100644 index 000000000..1ec131296 --- /dev/null +++ b/mdldjango/migrations/0003_auto_20260721_1751.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11 on 2026-07-21 12:21 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('mdldjango', '0002_auto_20190531_0547'), + ] + + operations = [ + migrations.RemoveField( + model_name='mdluser', + name='academic_code', + ), + migrations.RemoveField( + model_name='mdluser', + name='age_range', + ), + migrations.RemoveField( + model_name='mdluser', + name='aim', + ), + migrations.RemoveField( + model_name='mdluser', + name='flag', + ), + migrations.RemoveField( + model_name='mdluser', + name='gender', + ), + migrations.RemoveField( + model_name='mdluser', + name='icq', + ), + migrations.RemoveField( + model_name='mdluser', + name='invigilator', + ), + migrations.RemoveField( + model_name='mdluser', + name='msn', + ), + migrations.RemoveField( + model_name='mdluser', + name='organizer', + ), + migrations.RemoveField( + model_name='mdluser', + name='skype', + ), + migrations.RemoveField( + model_name='mdluser', + name='url', + ), + migrations.RemoveField( + model_name='mdluser', + name='yahoo', + ), + ] diff --git a/requirements-common.txt b/requirements-common.txt index c598c0602..58afbd143 100644 --- a/requirements-common.txt +++ b/requirements-common.txt @@ -8,18 +8,18 @@ cachetools==2.1.0 captcha==0.2.4 certifi==2022.12.7 chardet==3.0.4 -Django==1.11 +Django==3.2.25 django-appconf==1.0.2 -django-compressor==2.2 -django-extensions==2.1.3 -django-filter==2.0.0 +django-compressor==2.4.1 +django-extensions==3.1.5 +django-filter==2.4.0 django-future==0.2.3 django-htmlmin==0.10.0 django-masquerade==1.3 -django-picklefield==1.1.0 -django-report-builder==6.2.2 -django-widget-tweaks==1.4.3 -djangorestframework==3.8.2 +django-picklefield==3.0.1 +django-report-builder==6.5.2 +django-widget-tweaks==1.4.8 +djangorestframework==3.12.4 et-xmlfile==1.0.1 google-api-python-client==1.7.4 google-auth==1.5.1 @@ -31,7 +31,7 @@ idna==2.7 jdcal==1.4 lxml==4.2.5 MechanicalSoup==0.11.0 -mysqlclient==1.3.13 +mysqlclient==2.0.3 oauth2client==4.1.3 oauthlib==2.1.0 openpyxl==2.5.8 diff --git a/requirements-dev.txt b/requirements-dev.txt index 08ab59f51..5f4b8c1ed 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -13,7 +13,7 @@ ipdb==0.10.3 # ------------------------------------- pytest-django==2.9.1 pytest-pythonpath==0.7 -https://github.com/pytest-dev/pytest-cov/archive/master.zip +# https://github.com/pytest-dev/pytest-cov/archive/master.zip # pytest-cov==2.2.1 django-dynamic-fixture==1.9.0 mock==2.0.0 diff --git a/requirements-py3.txt b/requirements-py3.txt index 64a2e8010..b94e83d91 100644 --- a/requirements-py3.txt +++ b/requirements-py3.txt @@ -15,7 +15,7 @@ mccabe==0.4.0 MechanicalSoup==0.11.0 mock==2.0.0 more-itertools==5.0.0 -mysqlclient==1.3.13 +mysqlclient==2.0.3 packaging==18.0 pathlib2==2.3.3 pbr==5.1.1 @@ -33,8 +33,8 @@ pytest-pythonpath==0.7 requests==2.21.0 soupsieve==1.6 urllib3==1.23 -django-cors-headers==3.2.0 -django-ckeditor==5.8.0 +django-cors-headers==3.7.0 +django-ckeditor==6.0.0 python-memcached==1.59 rq==1.8.0 scipy==1.5.4 diff --git a/spoken/forms.py b/spoken/forms.py index d491fb289..0041072b9 100644 --- a/spoken/forms.py +++ b/spoken/forms.py @@ -163,15 +163,15 @@ class MediaTestimonialForm(forms.Form): ''' def __init__(self, *args, **kwargs): - on_home_page = kwargs.pop('on_home_page') - super(MediaTestimonialForm, self).__init__(*args, **kwargs) + on_home_page = kwargs.pop('on_home_page', 0) + super().__init__(*args, **kwargs) foss_list_choices = [('', '-- All Courses --'), ] foss_list = FossCategory.objects.filter(status=1, show_on_homepage=on_home_page).values('foss').annotate( Count('id')).order_by('foss').values_list('foss').distinct() for foss_row in foss_list: - foss_list_choices.append((str(foss_row[0]), str(foss_row[0]) )) + foss_list_choices.append((str(foss_row[0]), str(foss_row[0]))) self.fields['foss'].choices = foss_list_choices @@ -196,13 +196,16 @@ def __init__(self, *args, **kwargs): max_length=500) def clean(self): - if 'media' not in self.cleaned_data: - raise ValidationError({'media': ['No file or empty file given', ]}) - super(MediaTestimonialForm, self).clean() + cleaned_data = super().clean() + media = cleaned_data.get('media') + if not media: + self.add_error('media', 'No file or empty file given') + return cleaned_data formats = ['mp4', 'mp3', 'mov'] - if self.cleaned_data['media'].name[-3:] not in formats: - self._errors["media"] = self.error_class(["Not a valid file format."]) - return self.cleaned_data['media'] + ext = os.path.splitext(media.name)[1].lower().replace('.', '') + if ext not in formats: + self.add_error('media', 'Not a valid file format.') + return cleaned_data class MediaTestimonialEditForm(forms.ModelForm): diff --git a/spoken/settings.py b/spoken/settings.py index aed0b2341..2675b3522 100644 --- a/spoken/settings.py +++ b/spoken/settings.py @@ -130,6 +130,8 @@ # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases +DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' + CONN_MAX_AGE = DB_CONN_MAX_AGE_DEFAULT DATABASES = { @@ -311,17 +313,6 @@ REPORT_BUILDER_EXCLUDE = ['user'] # Allow all models except User to be accessed REPORT_BUILDER_ASYNC_REPORT = False -TEMPLATE_CONTEXT_PROCESSORS = ( - "django.contrib.auth.context_processors.auth", - "django.core.context_processors.debug", - "django.core.context_processors.i18n", - "django.core.context_processors.media", - "django.core.context_processors.static", - "django.core.context_processors.tz", - "django.contrib.messages.context_processors.messages", - "django.core.context_processors.request" -) - STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', diff --git a/spoken/urls.py b/spoken/urls.py index 2d00a93a3..b488bdf62 100644 --- a/spoken/urls.py +++ b/spoken/urls.py @@ -2,7 +2,7 @@ # Third Party Stuff from . import settings -from django.conf.urls import include, url +from django.urls import include, re_path from django.contrib import admin from django.views.generic import TemplateView from spoken.views import * @@ -17,136 +17,137 @@ admin.autodiscover() urlpatterns = [ - url(r'^robots\.txt', robots_txt, name='robots-txt'), - #url(r'^sitemap\.xml$', TemplateView.as_view(template_name='sitemap.xml', content_type='text/xml')), - url(r'^sitemap\.html$', sitemap, name='sitemap'), + re_path(r'^robots\.txt', robots_txt, name='robots-txt'), + #re_path(r'^sitemap\.xml$', TemplateView.as_view(template_name='sitemap.xml', content_type='text/xml')), + re_path(r'^sitemap\.html$', sitemap, name='sitemap'), # Examples: - url(r'^addu/$', add_user, name='addu'), - url(r'^logs/(?P[\w-]+)/download/$', download_log, name='download_log'), - # url(r'^NMEICT-Intro/$', nmeict_intro, name="nmeict_intro"), - url(r'^tutorial-search/$', tutorial_search, name="tutorial-search"), - url(r'^series/$', series_foss, name="series"), - url(r'^series_tutorial-search/$', series_tutorial_search, name="series-tutorial-search"), - url(r'^archived/$', archived_foss, name="archived"), - url(r'^archived_tutorial-search/$', archived_tutorial_search, name="archived-tutorial-search"), - url(r'^news/(?P[\w-]+)/$', news, name="news"), - url(r'^news/(?P[\w-]+)/(?P[\w-]+)/$', news_view, name="news_view"), - url(r'^keyword-search/$', keyword_search, name="keyword-search"), - url(r'^watch/([0-9a-zA-Z-+%\(\).,\' ]+)/([0-9a-zA-Z-+%\(\).,\' ]+)/([a-zA-Z-]+)/$', watch_tutorial, name="watch_tutorial"), - url(r'^What_is_a_Spoken_Tutorial/$', what_is_spoken_tutorial, name="what_is_spoken_tutorial"), - url(r'^get-language/(?P[\w-]+)/$', get_language, name="get_language"), - url(r'^testimonials/new/$', testimonials_new, name="testimonials_new"), - url(r'^testimonials/$', testimonials, name="testimonials"), - url(r'^testimonials/(?P[\w]+)/$', testimonials, name="testimonials"), - url(r'^testimonials/media/(?P[\w ]+)/$', foss_testimonials, name="foss_testimonials"), - - url(r'^admin/testimonials/$', admin_testimonials, name="admin_testimonials"), - url(r'^admin/testimonials/(?P\d+)/edit/$', admin_testimonials_edit, name="admin_testimonials_edit"), - url(r'^testimonials/new/media/(?P[\w]+)/$', testimonials_new_media, name="testimonials_new_media"), - url(r'^admin/testimonials/(?P\d+)/delete/$', admin_testimonials_delete, name="admin_testimonials_delete"), - url(r'^admin/testimonials/media/(?P\d+)/delete/$', admin_testimonials_media_delete,name="admin_testimonials_media_delete"), - url(r'^brochures/$', ViewBrochures, name="view_brochures"), - url(r'^$', home, name='home'), - url(r'^home/$', home, name='home'), - url(r'^site-feedback/$', site_feedback, name='site_feedback'), - url(r'^learn-Drupal/$', learndrupal, name='learndrupal'), - # url(r'^learn-Drupal./$', learndrupal', name='learndrupal'), - # url(r'^induction_old/$', induction_2017', name='induction_2017'), - url(r'^induction/$', induction_2017_new, name='induction_2017_new'), - # url(r'^induction/expression_of_intrest/$', expression_of_intrest', name='expression_of_intrest'), - url(r'^induction/expression_of_intrest/$', expression_of_intrest, name='expression_of_intrest'), - url(r'^induction/eoi/$', expression_of_intrest_new, name='expression_of_intrest_new'), - url(r'^admin/testimonials/media/(?P\d+)/edit/$', admin_testimonials_media_edit, name="admin_testimonials_media_edit"), - - # url(r'^spoken/', include('spoken.foo.urls')), + re_path(r'^addu/$', add_user, name='addu'), + re_path(r'^logs/(?P[\w-]+)/download/$', download_log, name='download_log'), + # re_path(r'^NMEICT-Intro/$', nmeict_intro, name="nmeict_intro"), + re_path(r'^tutorial-search/$', tutorial_search, name="tutorial-search"), + re_path(r'^series/$', series_foss, name="series"), + re_path(r'^series_tutorial-search/$', series_tutorial_search, name="series-tutorial-search"), + re_path(r'^archived/$', archived_foss, name="archived"), + re_path(r'^archived_tutorial-search/$', archived_tutorial_search, name="archived-tutorial-search"), + re_path(r'^news/(?P[\w-]+)/$', news, name="news"), + re_path(r'^news/(?P[\w-]+)/(?P[\w-]+)/$', news_view, name="news_view"), + re_path(r'^keyword-search/$', keyword_search, name="keyword-search"), + re_path(r'^watch/([0-9a-zA-Z-+%\(\).,\' ]+)/([0-9a-zA-Z-+%\(\).,\' ]+)/([a-zA-Z-]+)/$', watch_tutorial, name="watch_tutorial"), + re_path(r'^What_is_a_Spoken_Tutorial/$', what_is_spoken_tutorial, name="what_is_spoken_tutorial"), + re_path(r'^get-language/(?P[\w-]+)/$', get_language, name="get_language"), + re_path(r'^testimonials/new/$', testimonials_new, name="testimonials_new"), + re_path(r'^testimonials/$', testimonials, name="testimonials"), + re_path(r'^testimonials/(?P[\w]+)/$', testimonials, name="testimonials"), + re_path(r'^testimonials/media/(?P[\w ]+)/$', foss_testimonials, name="foss_testimonials"), + + re_path(r'^admin/testimonials/$', admin_testimonials, name="admin_testimonials"), + re_path(r'^admin/testimonials/(?P\d+)/edit/$', admin_testimonials_edit, name="admin_testimonials_edit"), + re_path(r'^testimonials/new/media/(?P[\w]+)/$', testimonials_new_media, name="testimonials_new_media"), + re_path(r'^admin/testimonials/(?P\d+)/delete/$', admin_testimonials_delete, name="admin_testimonials_delete"), + re_path(r'^admin/testimonials/media/(?P\d+)/delete/$', admin_testimonials_media_delete,name="admin_testimonials_media_delete"), + re_path(r'^brochures/$', ViewBrochures, name="view_brochures"), + re_path(r'^$', home, name='home'), + re_path(r'^home/$', home, name='home'), + re_path(r'^site-feedback/$', site_feedback, name='site_feedback'), + re_path(r'^learn-Drupal/$', learndrupal, name='learndrupal'), + # re_path(r'^learn-Drupal./$', learndrupal', name='learndrupal'), + # re_path(r'^induction_old/$', induction_2017', name='induction_2017'), + re_path(r'^induction/$', induction_2017_new, name='induction_2017_new'), + # re_path(r'^induction/expression_of_intrest/$', expression_of_intrest', name='expression_of_intrest'), + re_path(r'^induction/expression_of_intrest/$', expression_of_intrest, name='expression_of_intrest'), + re_path(r'^induction/eoi/$', expression_of_intrest_new, name='expression_of_intrest_new'), + re_path(r'^admin/testimonials/media/(?P\d+)/edit/$', admin_testimonials_media_edit, name="admin_testimonials_media_edit"), + + # re_path(r'^spoken/', include('spoken.foo.urls')), # Uncomment the admin/doc line below to enable admin documentation: - # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), + # re_path(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: - url(r'^admin/', include(admin.site.urls)), + re_path(r'^admin/', admin.site.urls), #subscription urls - url(r'^payment/callback/$', payment_callback, name="payment_callback"), - url(r'^payment/status/(?P[\w-]+)/$', check_payment_status, name="check_payment_status"), - url(r'^payment/subscription/$', subscription, name="initiate_payment"), + re_path(r'^payment/callback/$', payment_callback, name="payment_callback"), + re_path(r'^payment/status/(?P[\w-]+)/$', check_payment_status, name="check_payment_status"), + re_path(r'^payment/subscription/$', subscription, name="initiate_payment"), #ilw payment urls - url(r'^payment/ilw/callback/$', ilw_payment_callback, name="ilw_payment_callback"), - url(r'^payment/status/ilw/(?P[\w-]+)/$', check_ilw_payment_status, name="check_ilw_payment_status"), + re_path(r'^payment/ilw/callback/$', ilw_payment_callback, name="ilw_payment_callback"), + re_path(r'^payment/status/ilw/(?P[\w-]+)/$', check_ilw_payment_status, name="check_ilw_payment_status"), # evens old url - url(r'^workshops/college/view_college/(\d+)/$', view_college, name='view_college'), - url(r'^workshops/resource_center_view_college/(\d+)/$', view_college, name='view_college'), - url(r'^resource_center_view_college_map_details/(\d+)/$', view_college, name='view_college'), - # url(r'^software-training/academic-center/(\d+)/([a-zA-Z-]+)/$', view_college', name='view_college'), - url(r'^completed_workshops_list/(?P[\w-]+)/$', training_list, name='training_list'), - url(r'^view_completed_workshop/(\d+)/$', view_training, name='view_training'), - url(r'^feedback_list/(?P.+)/$', training_feedback, name='training_feedback'), - url(r'^feedback_view/(?P.+)/(?P.+)/$', view_training_feedback, name='view_training_feedback'), - url(r'^workshops/academic_details/$', academic_details, name='academic_details'), - url(r'^workshops/academic_details/(?P.+)/$', academic_details_state, name='academic_details_state'), - url(r'^resource_center_map_details/(?P.+)/$', academic_details_state, name='academic_details_state'), - url(r'^workshops/resource_center_details/$', view_college, name='view_college'), - # url(r'^statistics/training/$', statistics_training', name='statistics_training'), + re_path(r'^workshops/college/view_college/(\d+)/$', view_college, name='view_college'), + re_path(r'^workshops/resource_center_view_college/(\d+)/$', view_college, name='view_college'), + re_path(r'^resource_center_view_college_map_details/(\d+)/$', view_college, name='view_college'), + # re_path(r'^software-training/academic-center/(\d+)/([a-zA-Z-]+)/$', view_college', name='view_college'), + re_path(r'^completed_workshops_list/(?P[\w-]+)/$', training_list, name='training_list'), + re_path(r'^view_completed_workshop/(\d+)/$', view_training, name='view_training'), + re_path(r'^feedback_list/(?P.+)/$', training_feedback, name='training_feedback'), + re_path(r'^feedback_view/(?P.+)/(?P.+)/$', view_training_feedback, name='view_training_feedback'), + re_path(r'^workshops/academic_details/$', academic_details, name='academic_details'), + re_path(r'^workshops/academic_details/(?P.+)/$', academic_details_state, name='academic_details_state'), + re_path(r'^resource_center_map_details/(?P.+)/$', academic_details_state, name='academic_details_state'), + re_path(r'^workshops/resource_center_details/$', view_college, name='view_college'), + # re_path(r'^statistics/training/$', statistics_training', name='statistics_training'), # events urls - url(r'^software-training/', include('events.urls', namespace='events')), - url(r'^software-training/', include('events.urlsv2', namespace='eventsv2')), - - url(r'^participant/', include('mdldjango.urls', namespace='mdldjango')), - url(r'^cdcontent/', include('cdcontent.urls', namespace='cdcontent')), - url(r'^create_cd_content/', include('cdcontent.urls', namespace='cdcontent')), - url(r'^statistics/', include('statistics.urls', namespace='statistics')), - url(r'^list_videos/$', list_videos, name='list_videos'), + re_path(r'^software-training/', include(('events.urls', 'events'), namespace='events')), + re_path(r'^software-training/', include(('events.urlsv2', 'eventsv2'), namespace='eventsv2')), + + re_path(r'^participant/', include(('mdldjango.urls', 'mdldjango'), namespace='mdldjango')), + re_path(r'^cdcontent/', include(('cdcontent.urls', 'cdcontent'), namespace='cdcontent')), + re_path(r'^create_cd_content/', include(('cdcontent.urls', 'cdcontent'), namespace='cdcontent')), + re_path(r'^statistics/', include(('statistics.urls', 'statistics'), namespace='statistics')), + re_path(r'^list_videos/$', list_videos, name='list_videos'), + # team - url(r'^team/', include('team.urls')), + re_path(r'^team/', include('team.urls')), #api - url(r'^api/', include('api.urls', namespace='api')), + re_path(r'^api/', include(('api.urls', 'api'), namespace='api')), #training - url(r'^training/', include('training.urls', namespace='training')), + re_path(r'^training/', include(('training.urls', 'training'), namespace='training')), # certificate - url(r'^certificate/', include('certificate.urls', namespace='certificate')), + re_path(r'^certificate/', include(('certificate.urls', 'certificate'), namespace='certificate')), - url(r'^creation/', include('creation.urls', namespace='creation')), - url(r'^nicedit/', include('nicedit.urls')), - # url(r'^migration/creation/', include('creationmigrate.urls', namespace='creationmigrate')), - # url(r'^migration/events/', include('eventsmigration.urls', namespace='eventsmigration')), - #url(r'^media/(?P.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes': False}), + re_path(r'^creation/', include(('creation.urls', 'creation'), namespace='creation')), + re_path(r'^nicedit/', include('nicedit.urls')), + # re_path(r'^migration/creation/', include('creationmigrate.urls', namespace='creationmigrate')), + # re_path(r'^migration/events/', include('eventsmigration.urls', namespace='eventsmigration')), + #re_path(r'^media/(?P.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes': False}), # Old url adjustments - # url(r'^list_videos/$', list_videos', name='list_videos'), - url(r'^show_video/$', show_video, name='show_video'), - url(r'^search/node/([0-9a-zA-Z-+%\(\)]+)/$', search_node, name='search_node'), - url(r'^saveVideoData/$', saveVideoData, name='saveVideoData'), + # re_path(r'^list_videos/$', list_videos', name='list_videos'), + re_path(r'^show_video/$', show_video, name='show_video'), + re_path(r'^search/node/([0-9a-zA-Z-+%\(\)]+)/$', search_node, name='search_node'), + re_path(r'^saveVideoData/$', saveVideoData, name='saveVideoData'), # Masquerade user - # url(r'^masquerade/', include('masquerade.urls', namespace='masquerade')), - url(r'^masquerade/', include('impersonate.urls', namespace='impersonate')), + # re_path(r'^masquerade/', include('masquerade.urls', namespace='masquerade')), + re_path(r'^masquerade/', include(('impersonate.urls', 'impersonate'), namespace='impersonate')), # Cron links - url(r'^cron/subtitle-files/create/$', create_subtitle_files, name='create_subtitle_files'), + re_path(r'^cron/subtitle-files/create/$', create_subtitle_files, name='create_subtitle_files'), # reports - url(r'^report_builder/', include('report_builder.urls')), + re_path(r'^report_builder/', include('report_builder.urls')), # Youtube API V3 - url(r'^youtube/', include('youtube.urls', namespace='youtube')), + re_path(r'^youtube/', include(('youtube.urls', 'youtube'), namespace='youtube')), # reports - url(r'^reports/', include('reports.urls', namespace='reports')), + re_path(r'^reports/', include(('reports.urls', 'reports'), namespace='reports')), # events2 - # url(r'^events2/', include('events2.urls', namespace='events2')), - url(r'^cron/', include('cron.urls', namespace='cron')), + # re_path(r'^events2/', include('events2.urls', namespace='events2')), + re_path(r'^cron/', include(('cron.urls', 'cron'), namespace='cron')), #donation - url(r'^donate/', include('donate.urls', namespace='donate')), + re_path(r'^donate/', include(('donate.urls', 'donate'), namespace='donate')), # cms - url(r'^', include('cms.urls', namespace='cms')), + re_path(r'^', include(('cms.urls', 'cms'), namespace='cms')), #nep book fiar - url(r'wbf-book-fair-2023', bookfair,name="bookfair"), + re_path(r'wbf-book-fair-2023', bookfair,name="bookfair"), ] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT) diff --git a/spoken/views.py b/spoken/views.py index e99837086..56ea55b01 100644 --- a/spoken/views.py +++ b/spoken/views.py @@ -19,7 +19,7 @@ from django.shortcuts import render, get_object_or_404, redirect from django.views.decorators.csrf import csrf_exempt from django.template.context_processors import csrf -from django.core.urlresolvers import reverse +from django.urls import reverse # Spoken Tutorial Stuff from cms.forms import * @@ -514,30 +514,32 @@ def testimonials_new_media(request, testimonial_type): else: form = MediaTestimonialForm(request.POST, request.FILES, on_home_page=1) if form.is_valid(): - foss = FossCategory.objects.get(foss=request.POST.get('foss')) + foss = FossCategory.objects.get(foss=form.cleaned_data.get('foss')) if not request.FILES: - messages.error(request, 'Nothing uploaded. Choose a file for paste a link') + messages.error(request, 'Nothing uploaded. Choose a file or paste a link') else: file_container = request.FILES['media'] - # Put the uploaded file in the desired location. - file_name = str(user) + '-' + dt.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + file_container.name[-4:] - file_path = settings.MEDIA_ROOT + 'testimonials/' + str(foss.id) + '/' - from_media_path = 'testimonials/' + str(foss.id) + '/' + file_name - os.system("mkdir -p %s" % file_path) - full_path = file_path + file_name - fout = open(full_path, 'wb+') - # Iterate through the chunks. - for chunk in file_container.chunks(): - fout.write(chunk) - fout.close() + file_ext = os.path.splitext(file_container.name)[1] + file_name = str(user.username) + '-' + dt.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + file_ext + file_path = os.path.join(settings.MEDIA_ROOT, 'testimonials', str(foss.id)) + from_media_path = os.path.join('testimonials', str(foss.id), file_name) + os.makedirs(file_path, exist_ok=True) + full_path = os.path.join(file_path, file_name) + with open(full_path, 'wb+') as fout: + for chunk in file_container.chunks(): + fout.write(chunk) # Save in database - data = MediaTestimonials(foss=foss, path=from_media_path, user=request.POST.get('name'),workshop_details=request.POST.get('workshop_details'), content= request.POST.get('content')) - print(data) - messages.success(request, 'Testimonial has posted successfully!') + data = MediaTestimonials( + foss=foss, + path=from_media_path, + user=form.cleaned_data.get('name'), + workshop_details=form.cleaned_data.get('workshop_details'), + content=form.cleaned_data.get('content') + ) data.save() + messages.success(request, 'Testimonial has posted successfully!') return HttpResponseRedirect('/') context['form'] = form - context.update(csrf(request)) return render(request, 'spoken/templates/testimonial/mediaform.html', context) @@ -555,13 +557,11 @@ def admin_testimonials_media_edit(request, rid): else: context['form'] = form context['instance'] = testimonial - context.update(csrf(request)) return render(request, 'spoken/templates/testimonial/mediaform.html', context) form = MediaTestimonialEditForm(instance=testimonial) context['form'] = form context['instance'] = testimonial - context.update(csrf(request)) return render(request, 'spoken/templates/testimonial/mediaform.html', context) @@ -586,44 +586,27 @@ def testimonials_new(request): rid = form_data.id file_type = ['application/pdf'] if 'scan_copy' in request.FILES: - if request.FILES['scan_copy'].content_type in file_type: - file_path = settings.MEDIA_ROOT + 'testimonial/' - try: - os.mkdir(file_path) - except Exception as e: - print(e) - file_path = settings.MEDIA_ROOT + 'testimonial/' + str(rid) + '/' - try: - os.mkdir(file_path) - except Exception as e: - print(e) - full_path = file_path + str(rid) + ".pdf" - fout = open(full_path, 'wb+') - f = request.FILES['scan_copy'] - # Iterate through the chunks. - for chunk in f.chunks(): - fout.write(chunk) - fout.close() + uploaded_file = request.FILES['scan_copy'] + if uploaded_file.content_type in file_type or uploaded_file.name.lower().endswith('.pdf'): + file_path = os.path.join(settings.MEDIA_ROOT, 'testimonial', str(rid)) + os.makedirs(file_path, exist_ok=True) + full_path = os.path.join(file_path, str(rid) + ".pdf") + with open(full_path, 'wb+') as fout: + for chunk in uploaded_file.chunks(): + fout.write(chunk) messages.success(request, 'Testimonial has posted successfully!') return HttpResponseRedirect('/') context['form'] = form - context.update(csrf(request)) return render(request, 'spoken/templates/testimonial/form.html', context) def admin_testimonials_edit(request, rid): user = request.user context = {} - form = TestimonialsForm() - instance = '' if not user.has_perm('events.change_testimonials'): raise PermissionDenied() - try: - instance = Testimonials.objects.get(pk=rid) - except Exception as e: - raise Http404('Page not found') - print(e) + instance = get_object_or_404(Testimonials, pk=rid) if request.method == 'POST': form = TestimonialsForm(request.POST, request.FILES, instance=instance) @@ -631,29 +614,17 @@ def admin_testimonials_edit(request, rid): form_data = form.save(commit=False) form_data.user_id = user.id form_data.save() - file_type = ['application/pdf','image/jpeg','image/png'] + file_type = ['application/pdf', 'image/jpeg', 'image/png'] if 'scan_copy' in request.FILES: - if request.FILES['scan_copy'].content_type in file_type: - file_path = settings.MEDIA_ROOT + 'testimonial/' - try: - os.mkdir(file_path) - except Exception as e: - print(e) - file_path = settings.MEDIA_ROOT + 'testimonial/' + str(rid) + '/' - try: - os.mkdir(file_path) - except Exception as e: - print(e) - f = request.FILES['scan_copy'] - filename = str(f) - ext = os.path.splitext(filename)[1].lower() - full_path = file_path + str(rid) + ext - fout = open(full_path, 'wb+') - - # Iterate through the chunks. - for chunk in f.chunks(): - fout.write(chunk) - fout.close() + uploaded_file = request.FILES['scan_copy'] + ext = os.path.splitext(uploaded_file.name)[1].lower() + if uploaded_file.content_type in file_type or ext in ['.pdf', '.jpg', '.jpeg', '.png']: + file_path = os.path.join(settings.MEDIA_ROOT, 'testimonial', str(rid)) + os.makedirs(file_path, exist_ok=True) + full_path = os.path.join(file_path, str(rid) + ext) + with open(full_path, 'wb+') as fout: + for chunk in uploaded_file.chunks(): + fout.write(chunk) messages.success(request, 'Testimonial updated successfully!') return HttpResponseRedirect('/') @@ -661,49 +632,34 @@ def admin_testimonials_edit(request, rid): form = TestimonialsForm(instance=instance) context['form'] = form context['instance'] = instance - context.update(csrf(request)) return render(request, 'spoken/templates/testimonial/form.html', context) def admin_testimonials_delete(request, rid): user = request.user context = {} - instance = '' if not user.has_perm('events.delete_testimonials'): raise PermissionDenied() - try: - instance = Testimonials.objects.get(pk=rid) - except Exception as e: - raise Http404('Page not found') - print(e) + instance = get_object_or_404(Testimonials, pk=rid) if request.method == 'POST': - instance = Testimonials.objects.get(pk=rid) instance.delete() messages.success(request, 'Testimonial deleted successfully') return HttpResponseRedirect(reverse('admin_testimonials')) context['instance'] = instance - context.update(csrf(request)) return render(request, 'spoken/templates/testimonial/form.html', context) def admin_testimonials_media_delete(request, rid): user = request.user context = {} - instance = '' if not user.has_perm('events.delete_testimonials'): raise PermissionDenied() - try: - instance = MediaTestimonials.objects.get(pk=rid) - except Exception as error: - print(error) - raise Http404('Page not found') + instance = get_object_or_404(MediaTestimonials, pk=rid) if request.method == 'POST': - instance = MediaTestimonials.objects.get(pk=rid) instance.delete() messages.success(request, 'Testimonial deleted successfully') return HttpResponseRedirect(reverse('admin_testimonials')) context['instance'] = instance - context.update(csrf(request)) return render(request, 'spoken/templates/testimonial/mediaform.html', context) @@ -721,7 +677,6 @@ def admin_testimonials(request): context['collection'] = collection context['mediacollection'] = mediacollection context['media_url'] = settings.MEDIA_URL - context.update(csrf(request)) return render(request, 'spoken/templates/testimonial/index.html', context) @@ -923,7 +878,7 @@ def saveVideoData(request): "mongodb://"+MONGO_USER+':'+MONGO_PASS+'@'+MONGO_HOST+':'+MONGO_PORT+\ '/?authSource='+MONGO_DB) mydb = myclient[MONGO_DB] - if request.user.is_authenticated(): + if request.user.is_authenticated: d = request.POST name = request.user.username if not name: diff --git a/static/admin/auth/user/change_password.html b/static/admin/auth/user/change_password.html index 2a1b4d3c9..58b136c5f 100644 --- a/static/admin/auth/user/change_password.html +++ b/static/admin/auth/user/change_password.html @@ -1,5 +1,5 @@ {% extends "admin/base_site.html" %} -{% load i18n admin_static %} +{% load i18n static %} {% load admin_urls %} {% block extrahead %}{{ block.super }} diff --git a/static/admin/base.html b/static/admin/base.html index 140d39668..ee07873cc 100644 --- a/static/admin/base.html +++ b/static/admin/base.html @@ -1,4 +1,4 @@ -{% load admin_static %} +{% load static %} {% block title %}{% endblock %} diff --git a/static/admin/change_form.html b/static/admin/change_form.html index d4935ed78..77b1d9a12 100644 --- a/static/admin/change_form.html +++ b/static/admin/change_form.html @@ -1,5 +1,5 @@ {% extends "admin/base_site.html" %} -{% load i18n admin_urls admin_static admin_modify %} +{% load i18n admin_urls static admin_modify %} {% block extrahead %}{{ block.super }} diff --git a/static/admin/change_list.html b/static/admin/change_list.html index 15583d1a8..d6f610028 100644 --- a/static/admin/change_list.html +++ b/static/admin/change_list.html @@ -1,5 +1,5 @@ {% extends "admin/base_site.html" %} -{% load i18n admin_urls admin_static admin_list %} +{% load i18n admin_urls static admin_list %} {% block extrastyle %} {{ block.super }} diff --git a/static/admin/change_list_results.html b/static/admin/change_list_results.html index 419cf1e46..b22ddb840 100644 --- a/static/admin/change_list_results.html +++ b/static/admin/change_list_results.html @@ -1,4 +1,4 @@ -{% load i18n admin_static %} +{% load i18n static %} {% if result_hidden_fields %}
{# DIV for HTML validation #} {% for item in result_hidden_fields %}{{ item }}{% endfor %} diff --git a/static/admin/edit_inline/stacked.html b/static/admin/edit_inline/stacked.html index 32917756b..f93ea0f97 100644 --- a/static/admin/edit_inline/stacked.html +++ b/static/admin/edit_inline/stacked.html @@ -1,4 +1,4 @@ -{% load i18n admin_static %} +{% load i18n static %}

{{ inline_admin_formset.opts.verbose_name_plural|title }}

{{ inline_admin_formset.formset.management_form }} diff --git a/static/admin/edit_inline/tabular.html b/static/admin/edit_inline/tabular.html index 131fdb320..43dfd409b 100644 --- a/static/admin/edit_inline/tabular.html +++ b/static/admin/edit_inline/tabular.html @@ -1,4 +1,4 @@ -{% load i18n admin_static admin_modify %} +{% load i18n static admin_modify %}