示例#1
0
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,
                                       })
示例#2
0
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,
			})
示例#3
0
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)
示例#4
0
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)
示例#5
0
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
示例#6
0
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,
			}
		)
示例#7
0
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,
			})
示例#8
0
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,
        })
示例#9
0
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,
                                       })
示例#10
0
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,
			})