def get_sources(formdata,request,imageheaders): ra = formdata['ra'] dec = formdata['dec'] radius = formdata['radius'] units = formdata['units'] n_bands = formdata['n_bands'] if not imageheaders: raise NoCoverageError(radius=radius,units='arcseconds') Qs = [Q(user=request.user), Q(user__username='******')] q = reduce(operator.or_, Qs) results = AstroSource.objects.filter(q).annotate(nbands=Count('photometry__BAND',distinct=True)).positionFilter(ra,dec,radius=radius) results = [r for r in results if r.nbands >= n_bands or r.user==request.user] if formdata['forcedetect']: if 0.0 in [r.distance for r in results if r.user==request.user]: #Should let the user know there is already a source there! pass else: fields = {} sexRa,sexDec = deg2sex.main(ra,dec) fields['sourceID'] = 'uGROND_J%s%s' % (sexRa,sexDec) fields['RA'] = ra fields['DEC'] = dec fields['user'] = request.user s = AstroSource(**fields) s.save() s.distance = 0.0 results.append(s) if not results: #raise NoCoverageError(radius=radius) return {'no_results':True} distances = dict((i.sourceID,i.distance*3600) for i in results) #Keep distance for later ownership = dict((i.sourceID,i.user.username) for i in results) #Filter based on sourceID (chaining Q functions) # if results: # Qs = [Q(astrosource__sourceID=i.sourceID) for i in results] # q = reduce(operator.or_, Qs) # results = list(Photometry.objects.filter(q)) #group results by sourceID sources = [] for r in results: sources.append( {'name':r.sourceID,'distance':distances[r.sourceID],'ownership':ownership[r.sourceID]} ) sources = sorted(sources,key=lambda k: k['distance']) return {'sources':sources}