def search_haystack(request, species_wid, query): #search if species_wid is None: species_wid = Species.objects.all()[0].wid results = SearchQuerySet().filter(species_wid=species_wid).filter( content=query) #calculate facets facets = results.facet('model_type') tmp = facets.facet_counts()['fields']['model_type'] modelNameFacet = [] objectTypes = getObjectTypes() models = [] for tmp2 in tmp: modelName = objectTypes[objectTypes.index(tmp2[0])] modelNameFacet.append({ 'name': modelName, 'verbose_name': getModel(modelName)._meta.verbose_name, 'count': tmp2[1], }) models.append(getModel(modelName)) modelNameFacet.sort(lambda x, y: cmp(x['verbose_name'], y['verbose_name'])) #narrow search by facets model_type = request.GET.get('model_type', '') if model_type: results = results.models(getModel(model_type)) #order results results = results.order_by('wid') #convert results to query set queryset = EmptyQuerySet() for object in results: tmp = object.model.objects.none() tmp._result_cache.append(object.object) queryset = chain(queryset, tmp) #form response return render_queryset_to_response(species_wid=species_wid, request=request, models=models, queryset=queryset, templateFile='public/search.html', data={ 'query': query, 'engine': 'haystack', 'model_type': model_type, 'modelNameFacet': modelNameFacet, })
def search_haystack(request, species_wid, query): #search if species_wid is None: species_wid = Species.objects.all()[0].wid results = SearchQuerySet().filter(species_wid=species_wid).filter(content=query) #calculate facets facets = results.facet('model_type') tmp = facets.facet_counts()['fields']['model_type'] modelNameFacet = [] objectTypes = getObjectTypes() models = [] for tmp2 in tmp: modelName = objectTypes[objectTypes.index(tmp2[0])] modelNameFacet.append({ 'name':modelName, 'verbose_name': getModel(modelName)._meta.verbose_name, 'count':tmp2[1], }) models.append(getModel(modelName)) modelNameFacet.sort(lambda x, y:cmp(x['verbose_name'], y['verbose_name'])) #narrow search by facets model_type = request.GET.get('model_type', '') if model_type: results = results.models(getModel(model_type)) #order results results = results.order_by('wid') #convert results to query set queryset = EmptyQuerySet() for object in results: tmp = object.model.objects.none() tmp._result_cache.append(object.object) queryset = chain(queryset, tmp) #form response return render_queryset_to_response( species_wid = species_wid, request = request, models = models, queryset = queryset, templateFile = 'public/search.html', data = { 'query': query, 'engine': 'haystack', 'model_type': model_type, 'modelNameFacet': modelNameFacet, })
def exportData(request, species_wid=None): getDict = request.GET.copy() if getDict.get('format', ''): getDict.__setitem__('species', getDict.get('species', species_wid)) form = ExportDataForm(getDict or None) if not form.is_valid(): return render_queryset_to_response( species_wid=species_wid, request=request, templateFile='public/exportDataForm.html', data={'form': form}) else: species = Species.objects.get(wid=form.cleaned_data['species']) queryset = EmptyQuerySet() models = [] if form.cleaned_data['all_model_types'] == 'True': model_types = getObjectTypes() else: model_types = form.cleaned_data['model_type'] for model_type in model_types: model = getModel(model_type) if issubclass(model, SpeciesComponent): queryset = chain( queryset, model.objects.filter( species__id=species.id).select_related(depth=2).all()) else: queryset = chain( queryset, model.objects.select_related(depth=2).filter( id=species.id)) models.append(getModel(model_type)) return render_queryset_to_response( species_wid=species_wid, request=request, queryset=queryset, templateFile='public/exportDataResult.html', models=models)
def exportData(request, species_wid=None): getDict = request.GET.copy() if getDict.get('format', ''): getDict.__setitem__('species', getDict.get('species', species_wid)) form = ExportDataForm(getDict or None) if not form.is_valid(): return render_queryset_to_response( species_wid=species_wid, request = request, templateFile = 'public/exportDataForm.html', data = { 'form': form } ) else: species = Species.objects.get(wid = form.cleaned_data['species']) queryset = EmptyQuerySet() models = [] if form.cleaned_data['all_model_types'] == 'True': model_types = getObjectTypes() else: model_types = form.cleaned_data['model_type'] for model_type in model_types: model = getModel(model_type) if issubclass(model, SpeciesComponent): queryset = chain(queryset, model.objects.filter(species__id=species.id).select_related(depth=2).all()) else: queryset = chain(queryset, model.objects.select_related(depth=2).filter(id=species.id)) models.append(getModel(model_type)) return render_queryset_to_response( species_wid = species_wid, request = request, queryset = queryset, templateFile = 'public/exportDataResult.html', models = models)
def exportDataTemplate(request): queryset = EmptyQuerySet() models = [] for model_type in getObjectTypes(): models.append(getModel(model_type)) #write work book wb = writeExcel( Species(wid = '__NEW__', name = 'New species'), queryset, models, request.user.is_anonymous()) #save to string result = StringIO() wb.save(filename = result) #generate HttpResponse response = HttpResponse( result.getvalue(), mimetype = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", content_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") response['Content-Disposition'] = "attachment; filename=data.xlsx" return response
def edit(request, wid=None, model_type=None, species_wid=None, action='edit'): #retrieve object if action == 'edit': obj = getEntry(species_wid = species_wid, wid = wid) if obj is None: raise Http404 model = obj.__class__ else: model = getModel(model_type) obj = model() #save object error_messages = {} if request.method == 'POST': submitted_data = get_edit_form_data(model, request.POST) data = submitted_data data['id'] = obj.id data['species'] = species_wid data['model_type'] = model.__name__ try: #validate is WID unique if issubclass(model, SpeciesComponent): qs = SpeciesComponent.objects.values('wid', 'model_type').filter(species__wid=species_wid) else: qs = model.objects.values('wid', 'model_type').all() if action == 'edit': qs = qs.exclude(id=obj.id) wids = {} for x in qs: wids[x['wid']] = x['model_type'] if data['wid'] in wids.keys(): raise ValidationError({'wid': 'Value must be unique'}) wids[data['wid']] = model.__name__ #validate data = validate_object_fields(model, data, wids, species_wid, data['wid']) validate_model_objects(model, data) validate_model_unique(model, [data]) #save obj = save_object_data(species_wid, obj, data, {}, request.user, save=False, save_m2m=False) obj = save_object_data(species_wid, obj, data, {data['wid']: obj}, request.user, save=True, save_m2m=False) obj = save_object_data(species_wid, obj, data, {data['wid']: obj}, request.user, save=True, save_m2m=True) #redirect to details page return HttpResponseRedirect(obj.get_absolute_url()) except ValidationError as error: error_messages = error.message_dict #form query set if action == 'edit': obj = getEntry(species_wid = species_wid, wid = wid) if obj is None: raise Http404 qs = objectToQuerySet(obj, model = model) else: obj = None qs = model.objects.none() #display form fields, initial_values = get_edit_form_fields(species_wid, model, obj=obj) if request.method == 'POST': initial_values = submitted_data return render_queryset_to_response( species_wid = species_wid, request = request, models = [model], queryset = qs, templateFile = 'public/edit.html', data = { 'model_verbose_name': model._meta.verbose_name, 'action': action, 'fields': fields, 'references_choices': Reference.objects.filter(species__wid = species_wid).values_list('wid'), 'initial_values': initial_values, 'error_messages': error_messages, } )
def list(request, species_wid, model_type): try: getObjectTypes().index(model_type) except ValueError: raise Http404 species = Species.objects.get(wid=species_wid) model = getModel(model_type) objects = model.objects.all().filter(species__id=species.id) facet_fields = [] for field_full_name in model._meta.facet_fields: #facet field_names = str(field_full_name).split('__') tmp_model = model field_verbose_name = [] for field_name in field_names: field = tmp_model._meta.get_field_by_name(field_name)[0] field_verbose_name.append(field.verbose_name) if isinstance(field, (ForeignKey, ManyToManyField)): tmp_model = field.rel.to field_verbose_name = ' › '.join(field_verbose_name) if isinstance(field, (ForeignKey, ManyToManyField)) and not issubclass(field.rel.to, Entry): continue if isinstance(field, (ForeignKey, ManyToManyField)): tmp = model.objects.filter(species__id=species.id).order_by(field_full_name + '__name').values(field_full_name).annotate(count=Count(field_full_name)) else: tmp = model.objects.filter(species__id=species.id).order_by(field_full_name).values(field_full_name).annotate(count=Count(field_full_name)) facets = [] for facet in tmp: value = facet[field_full_name] if value is None or unicode(value) == '': continue if isinstance(field, (ForeignKey, ManyToManyField)): tmp2 = tmp_model.objects.values('wid', 'name').get(id=value) id = tmp2['wid'] name = capfirst(tmp2['name']) elif (field.choices is not None) and (len(field.choices) > 0) and (not isinstance(field, (BooleanField, NullBooleanField))): id = value choices = [x[0] for x in field.choices] if id in choices: name = field.choices[choices.index(id)][1] else: name = capfirst(value) else: id = value name = capfirst(value) if value is not None and unicode(value) != '': facets.append({ 'id': unicode(id), 'name': unicode(name), 'count': facet['count']}) if len(facets) > 1: facet_fields.append({ 'name': field_full_name, 'verbose_name': field_verbose_name, 'facets': facets, }) #filter val = request.GET.get(field_full_name) if val: if isinstance(field, (ForeignKey, ManyToManyField)): kwargs = {field_full_name + '__wid': val} elif isinstance(field, (BooleanField, NullBooleanField)): kwargs = {field_full_name: val == 'True'} elif isinstance(field, (AutoField, BigIntegerField, DecimalField, FloatField, IntegerField, PositiveIntegerField, PositiveSmallIntegerField, SmallIntegerField)): kwargs = {field_full_name: float(val)} else: kwargs = {field_full_name: val} objects = objects.filter(**kwargs) return render_queryset_to_response( species_wid = species_wid, request = request, models = [model], queryset = objects, templateFile = 'public/list.html', data = { 'model_type': model_type, 'model_verbose_name': model._meta.verbose_name, 'model_verbose_name_plural': model._meta.verbose_name_plural, 'facet_fields': facet_fields, })
def edit(request, wid=None, model_type=None, species_wid=None, action='edit'): #retrieve object if action == 'edit': obj = getEntry(species_wid=species_wid, wid=wid) if obj is None: raise Http404 model = obj.__class__ else: model = getModel(model_type) obj = model() #save object error_messages = {} if request.method == 'POST': submitted_data = get_edit_form_data(model, request.POST) data = submitted_data data['id'] = obj.id data['species'] = species_wid data['model_type'] = model.__name__ try: #validate is WID unique if issubclass(model, SpeciesComponent): qs = SpeciesComponent.objects.values( 'wid', 'model_type').filter(species__wid=species_wid) else: qs = model.objects.values('wid', 'model_type').all() if action == 'edit': qs = qs.exclude(id=obj.id) wids = {} for x in qs: wids[x['wid']] = x['model_type'] if data['wid'] in wids.keys(): raise ValidationError({'wid': 'Value must be unique'}) wids[data['wid']] = model.__name__ #validate data = validate_object_fields(model, data, wids, species_wid, data['wid']) validate_model_objects(model, data) validate_model_unique(model, [data]) #save obj = save_object_data(species_wid, obj, data, {}, request.user, save=False, save_m2m=False) obj = save_object_data(species_wid, obj, data, {data['wid']: obj}, request.user, save=True, save_m2m=False) obj = save_object_data(species_wid, obj, data, {data['wid']: obj}, request.user, save=True, save_m2m=True) #redirect to details page return HttpResponseRedirect(obj.get_absolute_url()) except ValidationError as error: error_messages = error.message_dict #form query set if action == 'edit': obj = getEntry(species_wid=species_wid, wid=wid) if obj is None: raise Http404 qs = objectToQuerySet(obj, model=model) else: obj = None qs = model.objects.none() #display form fields, initial_values = get_edit_form_fields(species_wid, model, obj=obj) if request.method == 'POST': initial_values = submitted_data return render_queryset_to_response( species_wid=species_wid, request=request, models=[model], queryset=qs, templateFile='public/edit.html', data={ 'model_verbose_name': model._meta.verbose_name, 'action': action, 'fields': fields, 'references_choices': Reference.objects.filter( species__wid=species_wid).values_list('wid'), 'initial_values': initial_values, 'error_messages': error_messages, })
def list(request, species_wid, model_type): try: getObjectTypes().index(model_type) except ValueError: raise Http404 species = Species.objects.get(wid=species_wid) model = getModel(model_type) objects = model.objects.all().filter(species__id=species.id) facet_fields = [] for field_full_name in model._meta.facet_fields: #facet field_names = str(field_full_name).split('__') tmp_model = model field_verbose_name = [] for field_name in field_names: field = tmp_model._meta.get_field_by_name(field_name)[0] field_verbose_name.append(field.verbose_name) if isinstance(field, (ForeignKey, ManyToManyField)): tmp_model = field.rel.to field_verbose_name = ' › '.join(field_verbose_name) if isinstance(field, (ForeignKey, ManyToManyField)) and not issubclass( field.rel.to, Entry): continue if isinstance(field, (ForeignKey, ManyToManyField)): tmp = model.objects.filter(species__id=species.id).order_by( field_full_name + '__name').values(field_full_name).annotate( count=Count(field_full_name)) else: tmp = model.objects.filter(species__id=species.id).order_by( field_full_name).values(field_full_name).annotate( count=Count(field_full_name)) facets = [] for facet in tmp: value = facet[field_full_name] if value is None or unicode(value) == '': continue if isinstance(field, (ForeignKey, ManyToManyField)): tmp2 = tmp_model.objects.values('wid', 'name').get(id=value) id = tmp2['wid'] name = capfirst(tmp2['name']) elif (field.choices is not None) and (len(field.choices) > 0) and ( not isinstance(field, (BooleanField, NullBooleanField))): id = value choices = [x[0] for x in field.choices] if id in choices: name = field.choices[choices.index(id)][1] else: name = capfirst(value) else: id = value name = capfirst(value) if value is not None and unicode(value) != '': facets.append({ 'id': unicode(id), 'name': unicode(name), 'count': facet['count'] }) if len(facets) > 1: facet_fields.append({ 'name': field_full_name, 'verbose_name': field_verbose_name, 'facets': facets, }) #filter val = request.GET.get(field_full_name) if val: if isinstance(field, (ForeignKey, ManyToManyField)): kwargs = {field_full_name + '__wid': val} elif isinstance(field, (BooleanField, NullBooleanField)): kwargs = {field_full_name: val == 'True'} elif isinstance(field, (AutoField, BigIntegerField, DecimalField, FloatField, IntegerField, PositiveIntegerField, PositiveSmallIntegerField, SmallIntegerField)): kwargs = {field_full_name: float(val)} else: kwargs = {field_full_name: val} objects = objects.filter(**kwargs) return render_queryset_to_response(species_wid=species_wid, request=request, models=[model], queryset=objects, templateFile='public/list.html', data={ 'model_type': model_type, 'model_verbose_name': model._meta.verbose_name, 'model_verbose_name_plural': model._meta.verbose_name_plural, 'facet_fields': facet_fields, })
def viewPropertyInSimulation(request, species_wid, class_name, property_name): #get model model = getModel(class_name) #get verbose class name verbose_class_name = model._meta.verbose_name #get verbose property name verbose_property_name = property_name for fieldset in model._meta.fieldsets: for field in fieldset[1]['fields']: if isinstance(field, (str, unicode)) and field == property_name: tmp = model._meta.get_field_by_name(property_name) if len(tmp) > 0: verbose_property_name = tmp[0].verbose_name if isinstance(field, dict) and field['name'] == property_name: verbose_property_name = field['verbose_name'] #get associated simulation code properties qs = ModelProperty.objects.get( species__wid = species_wid, class_name = class_name, property_name = property_name ).simulation_properties.all().order_by('class_name', 'property_name') #organize simulation code properties by class classes = {} for object in qs: if not classes.has_key(object.class_name): classes[object.class_name] = [] classes[object.class_name].append(object.property_name) #highlight code for each simulation class object_list = [] for sim_class_name in classes: sim_property_names = classes[sim_class_name] sim_property_names.sort() pathParts = sim_class_name.split('.') codePath = "%s/src/+%s/%s.m" % (MODEL_CODE_BASE_DIR, '/+'.join(pathParts[0:-1]), pathParts[-1]) if not os.path.isfile(codePath): codePath = "%s/src/+%s/@%s/%s.m" % (MODEL_CODE_BASE_DIR, '/+'.join(pathParts[0:-1]), pathParts[-1], pathParts[-1]) if not os.path.isfile(codePath): continue with open (codePath, "r") as codeFile: code = codeFile.read() lexer = MatlabLexer() lexer.add_filter(PropertyDefinitionFilter(property_names = sim_property_names, tokentype=Token.Name.Variable)) tokens = lexer.get_tokens(code) object_list.append({ 'class_name': sim_class_name, 'property_names': sim_property_names, 'code': pygments.format(tokens, PygmentsFormatter(linenos='inline', linenostep=1, style=PygmentsStyle, noclasses=True)), }) #render response return render_queryset_to_response( species_wid = species_wid, request = request, models = [SimulationProperty], queryset = qs, templateFile = 'public/viewPropertyInSimulation.html', data = { 'object_list': object_list, 'verbose_class_name': verbose_class_name, 'verbose_property_name': verbose_property_name, })