Merge branch 'data_migrations' of gimli.ms.mff.cuni.cz:/akce/mam/git/mamweb into data_migrations
This commit is contained in:
		
						commit
						d2c01583ef
					
				
					 5 changed files with 101 additions and 2 deletions
				
			
		|  | @ -3,7 +3,8 @@ from dal import autocomplete | |||
| from django.core.exceptions import ObjectDoesNotExist | ||||
| from django.contrib.auth.models import User | ||||
| 
 | ||||
| from .models import Skola, Resitel, Osoba | ||||
| from .models import Skola, Resitel, Osoba, Problem | ||||
| import seminar.models as m | ||||
| 
 | ||||
| from datetime import date | ||||
| import logging | ||||
|  | @ -210,3 +211,47 @@ class EditForm(forms.Form): | |||
| 	#			self.add_error('skola_nazev',forms.ValidationError('Je nutné vyplnit název školy')) | ||||
| 	#		elif data.get('skola_adresa')=='': | ||||
| 	#			self.add_error('skola_adresa',forms.ValidationError('Je nutné vyplnit adresu školy')) | ||||
| 
 | ||||
| class VlozReseniForm(forms.Form): | ||||
| 	#FIXME jen podproblémy daného problému | ||||
| 	problem = forms.ModelChoiceField(label='Problém',queryset=m.Problem.objects.all()) | ||||
| 	# to_field_name | ||||
| 	#problem = models.ManyToManyField(Problem, verbose_name='problém', help_text='Problém', | ||||
| 	#	through='Hodnoceni') | ||||
| 
 | ||||
| 	# FIXME pridat vice resitelu | ||||
| 	resitel = forms.ModelChoiceField(label="Řešitel", | ||||
| 		queryset=Resitel.objects.all(), | ||||
| 		widget=autocomplete.ModelSelect2( | ||||
| 			url='autocomplete_resitel', | ||||
| 			attrs = {'data-placeholder--id': '-1', | ||||
| 				'data-placeholder--text' : '---', | ||||
| 				'data-allow-clear': 'true'}) | ||||
|     		) | ||||
| 
 | ||||
| 
 | ||||
| 	#resitele = models.ManyToManyField(Resitel, verbose_name='autoři řešení', | ||||
| 	#	help_text='Seznam autorů řešení', through='Reseni_Resitele') | ||||
| 	 | ||||
| 	cas_doruceni = forms.DateField(label="Čas doručení") | ||||
| 
 | ||||
| 	#cas_doruceni = models.DateTimeField('čas_doručení', default=timezone.now, blank=True) | ||||
| 
 | ||||
| 	forma = forms.ChoiceField(label="Forma řešení",choices = m.Reseni.FORMA_CHOICES) | ||||
| 	#forma = models.CharField('forma řešení', max_length=16, choices=FORMA_CHOICES, blank=False, | ||||
| 	#	 default=FORMA_EMAIL) | ||||
| 
 | ||||
| 	poznamka = forms.CharField(label='Neveřejná poznámka')	 | ||||
| 	#poznamka = models.TextField('neveřejná poznámka', blank=True, | ||||
| 	#	help_text='Neveřejná poznámka k řešení (plain text)') | ||||
| 
 | ||||
| 	#TODO body do cisla | ||||
| 	#TODO prilohy | ||||
| 
 | ||||
| 	def __init__(self, *args, **kwargs): | ||||
| 		super(VlozReseniForm, self).__init__(*args, **kwargs) | ||||
| 		#self.fields['favorite_color'] = forms.ChoiceField(choices=[(color.id, color.name) for color in Resitel.objects.all()]) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -1263,8 +1263,10 @@ class TreeNode(PolymorphicModel): | |||
| 		verbose_name = "Srolovatelné", | ||||
| 		help_text = "Bude na stránce témátka možnost tuto položku skrýt") | ||||
| 	 | ||||
| 	# Slouží k debugování pro rychlé získání představy o podobě podstromu pod tímto TreeNode. | ||||
| 	def print_tree(self,indent=0): | ||||
| 		print("{}TreeNode({})".format(" "*indent,self.id)) | ||||
| 		# FIXME: Tady se spoléháme na to, že nedeklarovaný primární klíč se jmenuje by default 'id', což není úplně správně | ||||
| 		print("{}{} (id: {})".format(" "*indent,self, self.id)) | ||||
| 		if self.first_child: | ||||
| 			self.first_child.print_tree(indent=indent+2) | ||||
| 		if self.succ: | ||||
|  |  | |||
							
								
								
									
										21
									
								
								seminar/templates/seminar/org/vloz_reseni.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								seminar/templates/seminar/org/vloz_reseni.html
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| {% extends "seminar/zadani/base.html" %} | ||||
| {% load staticfiles %} | ||||
| {% block script %} | ||||
|     <!--script type="text/javascript" src="{% static 'admin/js/vendor/jquery/jquery.js' %}"></script!--> | ||||
|     {{form.media}} | ||||
|     <script src="{% static 'seminar/prihlaska.js' %}"></script> | ||||
| {% endblock %} | ||||
| 
 | ||||
| {% block content %} | ||||
| <h1> | ||||
|   {% block nadpis1a %}{% block nadpis1b %} | ||||
|     Vložit řešení | ||||
|   {% endblock %}{% endblock %} | ||||
| </h1> | ||||
| <form action="{% url 'seminar_vloz_reseni' %}" method="post"> | ||||
|   {% csrf_token %} | ||||
| {{form.as_p}} | ||||
|     <input type="submit" value="Vložit"> | ||||
| </form> | ||||
| 
 | ||||
| {% endblock %} | ||||
|  | @ -108,12 +108,17 @@ urlpatterns = [ | |||
| 	path('auth/logout/', views.LogoutView.as_view(), name='logout'), | ||||
| 	path('auth/resitel/', views.ResitelView.as_view(), name='seminar_resitel'), | ||||
| 	path('autocomplete/skola/',views.SkolaAutocomplete.as_view(), name='autocomplete_skola'), | ||||
| 	path('autocomplete/resitel/',views.ResitelAutocomplete.as_view(), name='autocomplete_resitel'), | ||||
| 	path('auth/reset_password/', views.PasswordResetView.as_view(), name='reset_password'), | ||||
| 	path('auth/change_password/', views.PasswordChangeView.as_view(), name='change_password'), | ||||
| 	path('auth/reset_password_done/', views.PasswordResetDoneView.as_view(), name='reset_password_done'), | ||||
| 	path('auth/reset_password_confirm/<uidb64>/<token>/', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'), | ||||
| 	path('auth/reset_password_complete/', views.PasswordResetCompleteView.as_view(), name='reset_password_complete'), | ||||
| 	path('auth/resitel_edit', views.resitelEditView, name='seminar_resitel_edit'), | ||||
| 
 | ||||
| 
 | ||||
| 	path('temp/add_solution', views.AddSolutionView.as_view(),name='seminar_vloz_reseni'), | ||||
| 
 | ||||
| 	path('', views.TitulniStranaView.as_view(), name='titulni_strana'), | ||||
| 
 | ||||
| 	# Ceka na autocomplete v3 | ||||
|  |  | |||
|  | @ -9,6 +9,7 @@ from django.utils.translation import ugettext as _ | |||
| from django.http import Http404,HttpResponseBadRequest,HttpResponseRedirect | ||||
| from django.db.models import Q, Sum, Count | ||||
| from django.views.decorators.csrf import ensure_csrf_cookie | ||||
| from django.views.generic.edit import FormView | ||||
| from django.contrib.auth import authenticate, login, get_user_model, logout | ||||
| from django.contrib.auth import views as auth_views | ||||
| from django.contrib.auth.models import User | ||||
|  | @ -22,6 +23,7 @@ from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Orga | |||
| from . import utils | ||||
| from .unicodecsv import UnicodeWriter | ||||
| from .forms import PrihlaskaForm, LoginForm, EditForm | ||||
| import seminar.forms as f | ||||
| 
 | ||||
| from datetime import timedelta, date, datetime | ||||
| from django.utils import timezone | ||||
|  | @ -1150,6 +1152,11 @@ class ResitelView(LoginRequiredMixin,generic.DetailView): | |||
| 		return Resitel.objects.get(osoba__user=self.request.user) | ||||
| 
 | ||||
| ## Formulare | ||||
| class AddSolutionView(LoginRequiredMixin, FormView): | ||||
| 	template_name = 'seminar/org/vloz_reseni.html' | ||||
| 	form_class = f.VlozReseniForm | ||||
| 	success_url = '/' | ||||
| 
 | ||||
| def resetPasswordView(request): | ||||
| 	pass | ||||
| 
 | ||||
|  | @ -1324,6 +1331,25 @@ class SkolaAutocomplete(autocomplete.Select2QuerySetView): | |||
| 		 | ||||
| 		return qs | ||||
| 
 | ||||
| class LoginRequiredAjaxMixin(object): | ||||
| 	def dispatch(self, request, *args, **kwargs): | ||||
| 		#if request.is_ajax() and not request.user.is_authenticated: # Pokud to otevřu jako stránku, tak se omezení neuplatní, takže to asi nechceme | ||||
| 		if not request.user.is_authenticated: | ||||
| 			return JsonResponse(data={'results': [], 'pagination': {}}, status=401) | ||||
| 		return super(LoginRequiredAjaxMixin, self).dispatch(request, *args, **kwargs) | ||||
| 
 | ||||
| class ResitelAutocomplete(LoginRequiredAjaxMixin,autocomplete.Select2QuerySetView): | ||||
| 	def get_queryset(self): | ||||
| 		qs = Resitel.objects.all() | ||||
| 		if self.q: | ||||
| 			qs = qs.filter( | ||||
| 				Q(osoba__jmeno__startswith=self.q)| | ||||
| 				Q(osoba__prijmeni__startswith=self.q)| | ||||
| 				Q(osoba__prezdivka__startswith=self.q) | ||||
| 				) | ||||
| 		return qs | ||||
| 
 | ||||
| 
 | ||||
| # Ceka na autocomplete v3 | ||||
| # class OrganizatorAutocomplete(autocomplete.Select2QuerySetView): | ||||
| # 	def get_queryset(self): | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Anet
						Anet