popup_form and autocomplete made single views in app.views
This commit is contained in:
parent
c1ca583e3c
commit
ab23f16047
|
@ -30,10 +30,11 @@ def get_real_ctype(module_name):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
'''
|
|
||||||
Base models class that all other models that have front-end views inherit from. It handles passing of parameters to generate the list of items on the left, as well as methods (that can be over-ridden) to generate the context to be sent to the template that renders the object.
|
|
||||||
'''
|
|
||||||
class ItfModel(models.Model):
|
class ItfModel(models.Model):
|
||||||
|
'''
|
||||||
|
Base models class that all other models that have front-end views inherit from. It handles passing of parameters to generate the list of items on the left, as well as methods (that can be over-ridden) to generate the context to be sent to the template that renders the object.
|
||||||
|
'''
|
||||||
fts_fields = [] #Fields that should be text-searchable through
|
fts_fields = [] #Fields that should be text-searchable through
|
||||||
fk_filters = [] #Foreign key fields that should be filterable by
|
fk_filters = [] #Foreign key fields that should be filterable by
|
||||||
# related_models = []
|
# related_models = []
|
||||||
|
@ -66,6 +67,12 @@ class ItfModel(models.Model):
|
||||||
'title': self.get_title()
|
'title': self.get_title()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#Data that's used by the autocomplete views
|
||||||
|
def autocomplete_dict(self):
|
||||||
|
d = self.list_dict()
|
||||||
|
d['text'] = self.get_text()
|
||||||
|
return d
|
||||||
|
|
||||||
#This should return all the context for the object that will get passed to the sub-template for this object.
|
#This should return all the context for the object that will get passed to the sub-template for this object.
|
||||||
def info_dict(self):
|
def info_dict(self):
|
||||||
d = self.get_dict()
|
d = self.get_dict()
|
||||||
|
@ -79,6 +86,17 @@ class ItfModel(models.Model):
|
||||||
return self.get(self.title_field)
|
return self.get(self.title_field)
|
||||||
|
|
||||||
|
|
||||||
|
#Returns "text" for this object - like a "description" or "about" field, or nothing - ideally would be over-ridden by subclasses.
|
||||||
|
def get_text(self):
|
||||||
|
try:
|
||||||
|
return self.description
|
||||||
|
except:
|
||||||
|
try:
|
||||||
|
return self.about
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
return ''
|
||||||
|
|
||||||
#Get the ModuleTab object associated with this object.
|
#Get the ModuleTab object associated with this object.
|
||||||
def get_tab(self):
|
def get_tab(self):
|
||||||
modelextra = self.get_modelextra()
|
modelextra = self.get_modelextra()
|
||||||
|
@ -102,6 +120,13 @@ class ItfModel(models.Model):
|
||||||
ret[form_name] = get_form(form_name)
|
ret[form_name] = get_form(form_name)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_popup_form(cls):
|
||||||
|
all_forms = cls.get_forms()
|
||||||
|
for k in all_forms.keys():
|
||||||
|
if k.startswith("Popup"):
|
||||||
|
return all_forms[k]
|
||||||
|
return all_forms[0]
|
||||||
|
|
||||||
'''
|
'''
|
||||||
Get the insidepages.models.ModelExtra object associated with this model
|
Get the insidepages.models.ModelExtra object associated with this model
|
||||||
|
|
|
@ -1,18 +1,57 @@
|
||||||
from django.template import RequestContext
|
from django.template import RequestContext
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.shortcuts import render_to_response, get_object_or_404, get_list_or_404
|
from django.shortcuts import render_to_response, get_object_or_404, get_list_or_404
|
||||||
|
from django.core.paginator import Paginator, InvalidPage, EmptyPage
|
||||||
from ox.django.shortcuts import json_response, render_to_json_response, get_object_or_404_json
|
from ox.django.shortcuts import json_response, render_to_json_response, get_object_or_404_json
|
||||||
|
|
||||||
from api.views import html_snapshot
|
#from api.views import html_snapshot
|
||||||
|
from django.contrib.contenttypes.models import ContentType
|
||||||
|
|
||||||
|
'''
|
||||||
def index(request):
|
def index(request):
|
||||||
context = RequestContext(request, {'settings':settings})
|
context = RequestContext(request, {'settings':settings})
|
||||||
if request.GET.get('_escaped_fragment_', None):
|
if request.GET.get('_escaped_fragment_', None):
|
||||||
return html_snapshot(request)
|
return html_snapshot(request)
|
||||||
return render_to_response('index.html', context)
|
return render_to_response('index.html', context)
|
||||||
|
'''
|
||||||
|
|
||||||
|
def autocomplete(request, ctype_id):
|
||||||
|
q = request.GET.get('q', '')
|
||||||
|
if q == '':
|
||||||
|
q = 'a'
|
||||||
|
page = int(request.GET.get('page', '1'))
|
||||||
|
page_limit = int(request.GET.get('page_limit', '10'))
|
||||||
|
ctype = get_object_or_404_json(ContentType, pk=ctype_id)
|
||||||
|
model_class = ctype.model_class()
|
||||||
|
#model_class = ContentType.objects.get_for_id(ctype_id)
|
||||||
|
qset = model_class.get_qset()
|
||||||
|
all_results = model_class.fts(qset, q)
|
||||||
|
paginator = Paginator(qset, page_limit)
|
||||||
|
results = paginator.page(page)
|
||||||
|
items = [obj.autocomplete_dict() for obj in results.object_list]
|
||||||
|
ret = {
|
||||||
|
'items': items,
|
||||||
|
'has_next': results.has_next()
|
||||||
|
}
|
||||||
|
return render_to_json_response(ret)
|
||||||
|
|
||||||
|
|
||||||
|
def popup_form(request, ctype_id):
|
||||||
|
ctype = get_object_or_404(ContentType, pk=ctype_id)
|
||||||
|
model_class = ctype.model_class()
|
||||||
|
form_class = model_class.get_popup_form()
|
||||||
|
if request.POST:
|
||||||
|
form = form_class(request.POST, request.FILES)
|
||||||
|
if form.is_valid():
|
||||||
|
instance = form.save()
|
||||||
|
text = instance.autocomplete_dict()['text']
|
||||||
|
return HttpResponse("<script>opener.dismissAddAnotherPopup(window, '%s', '%s')</script>" % (instance.id, text,))
|
||||||
|
else:
|
||||||
|
form = form_class()
|
||||||
|
context = RequestContext(request, {
|
||||||
|
'form': form
|
||||||
|
})
|
||||||
|
return render_to_response("test/popup.html", context)
|
||||||
|
|
||||||
|
|
||||||
def site_json(request):
|
def site_json(request):
|
||||||
|
|
|
@ -45,12 +45,14 @@ def edit_object(request, module_slug, tab_slug, object_id):
|
||||||
return render_to_response("edit_form.html", context)
|
return render_to_response("edit_form.html", context)
|
||||||
|
|
||||||
|
|
||||||
'''
|
|
||||||
Main function that handles incoming requests:
|
|
||||||
http://<website>/m/<module_name>/<tab_name>/?object_id=<x>&search=<search_term>&sort=<sort_string>&page=<page_no>&count=<items_per_page>
|
|
||||||
All options / parameters after <module_name> are optional.
|
|
||||||
'''
|
|
||||||
def render_object(request, module_slug):
|
def render_object(request, module_slug):
|
||||||
|
'''
|
||||||
|
Main function that handles incoming requests:
|
||||||
|
http://<website>/m/<module_name>/<tab_name>/?object_id=<x>&search=<search_term>&sort=<sort_string>&page=<page_no>&count=<items_per_page>
|
||||||
|
|
||||||
|
All options / parameters after <module_name> are optional.
|
||||||
|
|
||||||
|
'''
|
||||||
#Get the module from module slug in URL, else return a 404
|
#Get the module from module slug in URL, else return a 404
|
||||||
module = get_object_or_404(Module, slug=module_slug)
|
module = get_object_or_404(Module, slug=module_slug)
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,8 @@ from django.contrib.contenttypes.generic import generic_inlineformset_factory
|
||||||
from padmavideos.models import PadmaVideo, PadmaClip
|
from padmavideos.models import PadmaVideo, PadmaClip
|
||||||
from crispy_forms.helper import FormHelper
|
from crispy_forms.helper import FormHelper
|
||||||
from crispy_forms.layout import Submit
|
from crispy_forms.layout import Submit
|
||||||
|
from django.contrib.contenttypes.models import ContentType
|
||||||
|
|
||||||
|
|
||||||
class ItfForm(forms.ModelForm):
|
class ItfForm(forms.ModelForm):
|
||||||
|
|
||||||
|
@ -17,23 +19,50 @@ class ItfForm(forms.ModelForm):
|
||||||
super(ItfForm, self).__init__(*args, **kwargs)
|
super(ItfForm, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class ConnectionsWidget(forms.SelectMultiple):
|
class PopupForm(ItfForm):
|
||||||
template_name = 'formwidgets/select2_multiple.html'
|
'''
|
||||||
|
All popup forms inherit from this
|
||||||
|
'''
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class PopupPersonForm(PopupForm):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Person
|
||||||
|
|
||||||
|
|
||||||
|
class AutocompleteAddWidget(forms.Select):
|
||||||
|
template_name = 'formwidgets/select2.html'
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
ctype = kwargs.pop('ctype')
|
||||||
|
self.ctype = ctype
|
||||||
|
super(AutocompleteAddWidget, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
'''
|
|
||||||
def get_context_data(self):
|
|
||||||
ctx = super(ConnectionsWidget, self).get_context_data()
|
|
||||||
|
|
||||||
#ctx['data_json'] = [{'id': obj[0], 'text': obj[1]} for obj in self.choices]
|
|
||||||
return ctx
|
|
||||||
'''
|
|
||||||
|
|
||||||
def get_context(self, name, value, attrs, *args, **kwargs):
|
def get_context(self, name, value, attrs, *args, **kwargs):
|
||||||
ctx = super(ConnectionsWidget, self).get_context(name, value, attrs)
|
ctx = super(AutocompleteAddWidget, self).get_context(name, value, attrs)
|
||||||
ctx['popup_url'] = '/m/person/popup' #FIXME: url scheme, also, a better way to pass this context to the widget template.
|
ctx['ctype'] = self.ctype
|
||||||
#selected_values = [{'id': obj[0], 'text': obj[1]} for obj in self.choices if obj[0] in value]
|
|
||||||
#ctx['data_json'] = json.dumps(selected_values) # json.dumps(choices)
|
|
||||||
return ctx
|
return ctx
|
||||||
|
|
||||||
|
|
||||||
|
#class ConnectionsWidget(forms.SelectMultiple):
|
||||||
|
# template_name = 'formwidgets/select2_multiple.html'
|
||||||
|
|
||||||
|
# '''
|
||||||
|
# def get_context_data(self):
|
||||||
|
# ctx = super(ConnectionsWidget, self).get_context_data()
|
||||||
|
#
|
||||||
|
# #ctx['data_json'] = [{'id': obj[0], 'text': obj[1]} for obj in self.choices]
|
||||||
|
# return ctx
|
||||||
|
# '''
|
||||||
|
#
|
||||||
|
# def get_context(self, name, value, attrs, *args, **kwargs):
|
||||||
|
# ctx = super(ConnectionsWidget, self).get_context(name, value, attrs)
|
||||||
|
# ctx['popup_url'] = '/m/person/popup' #FIXME: url scheme, also, a better way to pass this context to the widget template.
|
||||||
|
# #selected_values = [{'id': obj[0], 'text': obj[1]} for obj in self.choices if obj[0] in value]
|
||||||
|
# #ctx['data_json'] = json.dumps(selected_values) # json.dumps(choices)
|
||||||
|
# return ctx
|
||||||
|
|
||||||
class ItfAllAuthRegForm(forms.Form):
|
class ItfAllAuthRegForm(forms.Form):
|
||||||
firstname=forms.CharField()
|
firstname=forms.CharField()
|
||||||
|
@ -42,7 +71,7 @@ class ItfAllAuthRegForm(forms.Form):
|
||||||
def save(self, user):
|
def save(self, user):
|
||||||
first_name = self.cleaned_data['firstname']
|
first_name = self.cleaned_data['firstname']
|
||||||
last_name = self.cleaned_data['lastname']
|
last_name = self.cleaned_data['lastname']
|
||||||
p = Person(user=user, first_name=first_name, last_name=last_name)
|
p = Person(user=user, first_name=first_name, last_name=last_name, email=user.email)
|
||||||
p.save()
|
p.save()
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
@ -57,7 +86,8 @@ class ItfRegistrationForm(RegistrationForm):
|
||||||
|
|
||||||
|
|
||||||
class ConnectionsForm(ItfForm):
|
class ConnectionsForm(ItfForm):
|
||||||
person2 = forms.ModelMultipleChoiceField(Person.objects.all(), widget=ConnectionsWidget())
|
ctype = ContentType.objects.get_for_model(Person)
|
||||||
|
person2 = forms.ModelChoiceField(Person.objects.all(), widget=AutocompleteAddWidget(ctype=ctype))
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = PersonPerson
|
model = PersonPerson
|
||||||
|
|
|
@ -13,30 +13,30 @@ GENDER_CHOICES = (
|
||||||
|
|
||||||
class Person(ItfModel):
|
class Person(ItfModel):
|
||||||
#ItfModel stuff:
|
#ItfModel stuff:
|
||||||
form_names = ['PersonForm']
|
form_names = ['PersonForm', 'PopupPersonForm']
|
||||||
fts_fields = ['first_name', 'last_name', 'email', 'about']
|
fts_fields = ['first_name', 'last_name', 'email', 'about']
|
||||||
#Basic Info
|
#Basic Info
|
||||||
user = models.ForeignKey(User, blank=True, null=True, db_index=True, editable=False)
|
user = models.ForeignKey(User, blank=True, null=True, db_index=True, editable=False)
|
||||||
first_name = models.CharField(max_length=255)
|
first_name = models.CharField(max_length=255)
|
||||||
last_name = models.CharField(max_length=255)
|
last_name = models.CharField(max_length=255)
|
||||||
email = models.EmailField(blank=True, null=True, unique=True, db_index=True)
|
email = models.EmailField(blank=True, null=True, unique=True, db_index=True)
|
||||||
email_validated = models.BooleanField(default=False, editable=False)
|
# email_validated = models.BooleanField(default=False, editable=False)
|
||||||
tel_no = models.CharField(max_length=100, blank=True)
|
tel_no = models.CharField(max_length=100, blank=True)
|
||||||
about = models.TextField(blank=True, null=True)
|
about = models.TextField(blank=True, null=True)
|
||||||
|
dob = models.DateField(null=True, verbose_name="Date of Birth")
|
||||||
|
is_practitioner = models.BooleanField(default=False)
|
||||||
|
is_enthusiast = models.BooleanField(default=True)
|
||||||
|
is_freelancer = models.BooleanField(default=False)
|
||||||
|
|
||||||
#Occupation info
|
#Occupation info
|
||||||
occupations = models.ManyToManyField("Occupation", through='PersonOccupation', blank=True, null=True)
|
occupations = models.ManyToManyField("Occupation", through='PersonOccupation', blank=True, null=True)
|
||||||
is_practitioner = models.BooleanField(default=False)
|
|
||||||
is_enthusiast = models.BooleanField(default=True)
|
|
||||||
|
|
||||||
#Personal info
|
#Personal info
|
||||||
dob = models.DateField(null=True, verbose_name="Date of Birth")
|
|
||||||
gender = models.CharField(max_length=255, choices=GENDER_CHOICES, blank=True)
|
gender = models.CharField(max_length=255, choices=GENDER_CHOICES, blank=True)
|
||||||
image = models.ImageField(upload_to='images/', blank=True, null=True)
|
image = models.ImageField(upload_to='images/', blank=True, null=True)
|
||||||
locations = models.ManyToManyField("Location", blank=True, null=True)
|
locations = models.ManyToManyField("Location", blank=True, null=True)
|
||||||
|
|
||||||
#Groups and Connections
|
#Groups and Connections
|
||||||
is_freelancer = models.BooleanField(default=False)
|
|
||||||
groups = models.ManyToManyField("TheatreGroup", blank=True, null=True, through='PersonGroup')
|
groups = models.ManyToManyField("TheatreGroup", blank=True, null=True, through='PersonGroup')
|
||||||
connections = models.ManyToManyField('Person', blank=True, null=True, through='PersonPerson')
|
connections = models.ManyToManyField('Person', blank=True, null=True, through='PersonPerson')
|
||||||
productions = models.ManyToManyField("Production", blank=True, null=True, through='PersonProduction')
|
productions = models.ManyToManyField("Production", blank=True, null=True, through='PersonProduction')
|
||||||
|
@ -55,7 +55,9 @@ class Person(ItfModel):
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return "%s %s" % (self.first_name, self.last_name,)
|
return "%s %s" % (self.first_name, self.last_name,)
|
||||||
|
|
||||||
|
def get_title(self):
|
||||||
|
return self.__unicode__()
|
||||||
|
|
||||||
|
|
||||||
class Occupation(models.Model):
|
class Occupation(models.Model):
|
||||||
name = models.CharField(max_length=255)
|
name = models.CharField(max_length=255)
|
||||||
|
|
2
itf/templates/formwidgets/select2.html
Normal file
2
itf/templates/formwidgets/select2.html
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
<input type="hidden" id="id_{{name}}" name="{{name}}" data-ctype="{{ ctype.id }}" class="select2class" value="{{ value }}" style="width:600px;" /> <a href="/popup_form/{{ ctype.id }}" id="add_{{name}}" onclick="return showAddAnotherPopup(this);">Add</a>
|
||||||
|
|
|
@ -32,6 +32,7 @@ $(function(){
|
||||||
|
|
||||||
});
|
});
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
sampleData = [
|
sampleData = [
|
||||||
{
|
{
|
||||||
'id': 'foo',
|
'id': 'foo',
|
||||||
|
@ -40,7 +41,43 @@ $(function(){
|
||||||
'last_name': 'test'
|
'last_name': 'test'
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
*/
|
||||||
|
$('.select2class').each(function() {
|
||||||
|
var ctype_id = $(this).attr("data-ctype");
|
||||||
|
var url = '/autocomplete/' + ctype_id;
|
||||||
|
$(this).select2({
|
||||||
|
ajax: {
|
||||||
|
'url': url,
|
||||||
|
dataType: 'json',
|
||||||
|
quietMillis: 100,
|
||||||
|
data: function(term, page) {
|
||||||
|
return {
|
||||||
|
q: term,
|
||||||
|
page_limit: 10,
|
||||||
|
page: page
|
||||||
|
}
|
||||||
|
},
|
||||||
|
results: function(data, page) {
|
||||||
|
//console.log(data);
|
||||||
|
var more = data.has_next;
|
||||||
|
//console.log(data);
|
||||||
|
return {results: data.items, more: more};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
formatResult: function(item) {
|
||||||
|
return "<div>" + item.title + "<div style='font-size:12px'><i>" + item.text + "</i></div></div>"
|
||||||
|
},
|
||||||
|
formatSelection: function(item) {
|
||||||
|
//console.log(item);
|
||||||
|
//return "<div>" + item.first_name + " " + item.last_name + "<div>" + item.about + "</div></div>";
|
||||||
|
//console.log("foo");
|
||||||
|
return item.title;
|
||||||
|
//return "<div data-id='" + item.id + "'>" + item.first_name + " " + item.last_name + "</div>";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
$('.select2class').select2({
|
$('.select2class').select2({
|
||||||
//placeholder: 'Select your connections',
|
//placeholder: 'Select your connections',
|
||||||
//multiple: true,
|
//multiple: true,
|
||||||
|
@ -87,6 +124,7 @@ $(function(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
*/
|
||||||
// console.log(sampleData);
|
// console.log(sampleData);
|
||||||
// $('#id_connections').select2("val", sampleData);
|
// $('#id_connections').select2("val", sampleData);
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,9 @@ urlpatterns = patterns('',
|
||||||
#Test views:
|
#Test views:
|
||||||
(r'test_profile', 'itfprofiles.views.person_form'),
|
(r'test_profile', 'itfprofiles.views.person_form'),
|
||||||
(r'edit_profile', 'itfprofiles.views.edit_profile'),
|
(r'edit_profile', 'itfprofiles.views.edit_profile'),
|
||||||
(r'^autocompletes/itfprofiles/$', 'itfprofiles.views.autocomplete'),
|
(r'^autocomplete/(?P<ctype_id>\d+)', 'app.views.autocomplete'),
|
||||||
|
(r'^popup_form/(?P<ctype_id>\d+)', 'app.views.popup_form'),
|
||||||
|
# (r'^autocompletes/itfprofiles/$', 'itfprofiles.views.autocomplete'),
|
||||||
(r'^popup/person', 'itfprofiles.views.personpopup'),
|
(r'^popup/person', 'itfprofiles.views.personpopup'),
|
||||||
# (r'i/', include('itfcore.urls')),
|
# (r'i/', include('itfcore.urls')),
|
||||||
(r'^admin/doc/', include('django.contrib.admindocs.urls')),
|
(r'^admin/doc/', include('django.contrib.admindocs.urls')),
|
||||||
|
|
Loading…
Reference in New Issue
Block a user