示例#1
0
文件: views.py 项目: Jan91/grondview
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}