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'] = '
Please fill Remarks field '
- else:
- self._errors['remarks'] = 'Please fill Remarks field '
- 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 += '' + td_rec.tutorial + ' '
- if data:
- data = 'Select Tutorial ' + 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 += '' + td_rec.tutorial + ' '
+ if data:
+ data = 'Select Tutorial ' + 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 = 'Select Language ' + 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 += '' + tutorial.tutorial_detail.tutorial + ' '
if data:
data = 'Select Tutorial ' + 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 += '' + language.name + ' '
if data:
data = 'Select Language ' + 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 = 'Select Status Pending '
- 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 += 'Need Improvement '
if comp in ['code', 'assignment', 'additional_material']:
data += 'Not Required '
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] = 'Select Tutorial Name '
data[1] = 'Outline Script '
for tutorial in tutorials:
data[0] += '' + tutorial.tutorial_detail.tutorial + ' '
- if lang_rec.name == 'English':
+ if lang_rec and lang_rec.name == 'English':
data[1] += 'Slides Video Codefiles Assignment Prerequisite Keywords Additional material '
else:
data[1] += 'Video '
data[1] = 'Select Component ' + 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 += '' + language.name + ' '
if data:
data = 'Select Language ' + 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 += '' + \
- str(tutorial[1]) + ' '
+ data += '' + str(tutorial[1]) + ' '
if data:
data = '-- Select Language -- ' + 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 += '' + \
- str(tutorial[1]) + ' '
+ data += '' + str(tutorial[1]) + ' '
if data:
data = '-- Select Tutorial -- ' + 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 %}