summaryrefslogtreecommitdiff
path: root/src/meetingtools/apps/room/tasks.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/meetingtools/apps/room/tasks.py')
-rw-r--r--src/meetingtools/apps/room/tasks.py250
1 files changed, 0 insertions, 250 deletions
diff --git a/src/meetingtools/apps/room/tasks.py b/src/meetingtools/apps/room/tasks.py
deleted file mode 100644
index ce9f275..0000000
--- a/src/meetingtools/apps/room/tasks.py
+++ /dev/null
@@ -1,250 +0,0 @@
-'''
-Created on Jan 18, 2012
-
-@author: leifj
-'''
-from celery.task import periodic_task,task
-from celery.schedules import crontab
-from meetingtools.apps.cluster.models import ACCluster
-from meetingtools.ac import ac_api_client
-from meetingtools.apps.room.models import Room
-import iso8601
-from django.contrib.auth.models import User
-from django.core.cache import cache
-from django.core.exceptions import ObjectDoesNotExist
-import logging
-from datetime import datetime,timedelta
-from lxml import etree
-from django.db.models import Q
-from django.contrib.humanize.templatetags import humanize
-from django.conf import settings
-from django.core.mail import send_mail
-
-def _owner_username(api,sco):
- logging.debug(sco)
- key = '_sco_owner_%s' % sco.get('sco-id')
- logging.debug(key)
- try:
- if cache.get(key) is None:
- fid = sco.get('folder-id')
- if not fid:
- logging.debug("No folder-id")
- return None
-
- folder_id = int(fid)
- r = api.request('sco-info',{'sco-id':folder_id},False)
- if r.status_code() == 'no-data':
- return None
-
- parent = r.et.xpath("//sco")[0]
- logging.debug("p %s",repr(parent))
- logging.debug("r %s",etree.tostring(parent))
- name = None
- if parent:
- logging.debug("parent: %s" % parent)
- if parent.findtext('name') == 'User Meetings':
- name = sco.findtext('name')
- else:
- name = _owner_username(api,parent)
-
- cache.set(key,name)
-
- return cache.get(key)
- except Exception,e:
- logging.debug(e)
- return None
-
-def _extended_info(api,sco_id):
- r = api.request('sco-info',{'sco-id':sco_id},False)
- if r.status_code == 'no-data':
- return None
- return (r.et,_owner_username(api,r.et.xpath('//sco')[0]))
-
-def _import_one_room(acc,api,row):
- sco_id = int(row.get('sco-id'))
- last = iso8601.parse_date(row.findtext("date-modified[0]"))
- room = None
-
- try:
- room = Room.objects.get(acc=acc,deleted_sco_id=sco_id)
- if room is not None:
- return # We hit a room in the process of being cleaned - let it simmer until next pass
- except ObjectDoesNotExist:
- pass
- except Exception,e:
- logging.debug(e)
- return
-
- try:
- logging.debug("finding acc=%s,sco_id=%d in our DB" % (acc,sco_id))
- room = Room.objects.get(acc=acc,sco_id=sco_id)
- if room.deleted_sco_id is not None:
- return # We hit a room in the process of being cleaned - let it simmer until next pass
- room.trylock()
- except ObjectDoesNotExist:
- pass
-
- last = last.replace(tzinfo=None)
- lastupdated = None
- if room:
- lastupdated = room.lastupdated.replace(tzinfo=None) # make the compare work - very ugly
-
- #logging.debug("last %s" % last)
- #logging.debug("lastupdated %s" % lastupdated)
- if not room or lastupdated < last:
- (r,username) = _extended_info(api, sco_id)
- logging.debug("found room owned by %s time for and update" % username)
- if username is None:
- return
-
- logging.debug(etree.tostring(row))
- logging.debug(etree.tostring(r))
- urlpath = row.findtext("url[0]").strip("/")
- name = row.findtext('name[0]')
- description = row.findtext('description[0]')
- folder_sco_id = 0
- source_sco_id = 0
-
- def _ior0(elt,a,dflt):
- str = elt.get(a,None)
- if str is None or not str:
- return dflt
- else:
- return int(str)
-
-
- for elt in r.findall(".//sco[0]"):
- folder_sco_id = _ior0(elt,'folder-id',0)
- source_sco_id = _ior0(elt,'source-sco-id',0)
-
- logging.debug("urlpath=%s, name=%s, folder_sco_id=%s, source_sco_id=%s" % (urlpath,name,folder_sco_id,source_sco_id))
-
- if room is None:
- if folder_sco_id:
- user,created = User.objects.get_or_create(username=username)
- if created:
- user.set_unusable_password()
- room = Room.objects.create(acc=acc,sco_id=sco_id,creator=user,name=name,description=description,folder_sco_id=folder_sco_id,source_sco_id=source_sco_id,urlpath=urlpath)
- room.trylock()
- else:
- if folder_sco_id:
- room.folder_sco_id = folder_sco_id
- room.source_sco_id = source_sco_id
- room.description = description
- room.urlpath = urlpath
-
- if room is not None:
- room.save()
- room.unlock()
- else:
- if room is not None:
- room.unlock()
-
-def import_acc(acc,since=0):
- with ac_api_client(acc) as api:
- r = None
- if since > 0:
- then = datetime.now()-timedelta(seconds=since)
- then = then.replace(microsecond=0)
- r = api.request('report-bulk-objects',{'filter-type': 'meeting','filter-gt-date-modified': then.isoformat()})
- else:
- r = api.request('report-bulk-objects',{'filter-type': 'meeting'})
-
- for row in r.et.xpath("//row"):
- try:
- _import_one_room(acc,api,row)
- except Exception,ex:
- logging.error(ex)
-
-@periodic_task(run_every=crontab(hour="*", minute="*", day_of_week="*"))
-def import_all_rooms():
- for acc in ACCluster.objects.all():
- import_acc(acc,since=3600)
-
-def start_user_counts_poll(room,niter):
- poll_user_counts.apply_async(args=[room],kwargs={'niter': niter})
-
-@task(name='meetingtools.apps.room.tasks.poll_user_counts',rate_limit="10/s")
-def poll_user_counts(room,niter=0):
- logging.debug("polling user_counts for room %s" % room.name)
- with ac_api_client(room.acc) as api:
- (nusers,nhosts) = api.poll_user_counts(room)
- if nusers > 0:
- logging.debug("room occupied by %d users and %d hosts, checking again in 20 ..." % (nusers,nhosts))
- poll_user_counts.apply_async(args=[room],kwargs={'niter': 0},countdown=20)
- elif niter > 0:
- logging.debug("room empty, will check again in 5 for %d more times ..." % (niter -1))
- poll_user_counts.apply_async(args=[room],kwargs={'niter': niter-1},countdown=5)
- return (nusers,nhosts)
-
-# belts and suspenders - we setup polling for active rooms aswell...
-@periodic_task(run_every=crontab(hour="*", minute="*/5", day_of_week="*"))
-def import_recent_user_counts():
- for acc in ACCluster.objects.all():
- with ac_api_client(acc) as api:
- then = datetime.now()-timedelta(seconds=600)
- for room in Room.objects.filter((Q(lastupdated__gt=then) | Q(lastvisited__gt=then)) & Q(acc=acc)):
- api.poll_user_counts(room)
-
-# look for sessions that are newer than the one we know about for a room
-@periodic_task(run_every=crontab(hour="*", minute="*", day_of_week="*"))
-def import_sessions():
- for room in Room.objects.all():
- with ac_api_client(room.acc) as api:
- p = {'sco-id': room.sco_id,'sort-date-created': 'asc'}
- if room.lastvisited != None:
- last = room.lastvisited
- last.replace(microsecond=0)
- p['filter-gt-date-created'] = last.isoformat()
- r = api.request('report-meeting-sessions',p)
- for row in r.et.xpath("//row"):
- date_created = iso8601.parse_date(row.findtext("date-created"))
- logging.debug("sco_id=%d lastvisited: %s" % (room.sco_id,date_created))
- room.lastvisited = date_created
- room.save()
- break
-
-#@periodic_task(run_every=crontab(hour="*", minutes="*/5", day_of_week="*"))
-def import_transactions():
- for acc in ACCluster.objects.all():
- then = datetime.now() - timedelta(seconds=600)
- then = then.replace(microsecond=0)
- with ac_api_client(acc) as api:
- seen = {}
- r = api.request('report-bulk-consolidated-transactions',{'filter-type':'meeting','sort-date-created': 'asc','filter-gt-date-created': then.isformat()})
- for row in r.et.xpath("//row"):
- sco_id = row.get('sco-id')
- logging.debug("last session for sco_id=%d" % sco_id)
- if not seen.get(sco_id,False): #pick the first session for each room - ie the one last created
- seen[sco_id] = True
- try:
- room = Room.objects.get(acc=acc,sco_id=sco_id)
- date_created = iso8601.parse_date(row.findtext("date-created"))
- room.lastvisited = date_created
- room.save()
- except ObjectDoesNotExist:
- pass # we only care about rooms we know about here
-
-@task(name="meetingtools.apps.room.tasks.mail")
-def send_message(user,subject,message):
- try:
- p = user.get_profile()
- if p and p.email:
- send_mail(subject,message,settings.NOREPLY,[p.email])
- else:
- logging.info("User %s has no email address - email not sent" % user.username)
- except ObjectDoesNotExist:
- logging.info("User %s has no profile - email not sent" % user.username)
- except Exception,exc:
- logging.error("Error while sending email: \n%s" % exc)
- send_message.retry(exc=exc)
-
-@periodic_task(run_every=crontab(hour="1", minute="5", day_of_week="*"))
-def clean_old_rooms():
- for acc in ACCluster.objects.all():
- then = datetime.now() - timedelta(days=30)
- then = then.replace(microsecond=0)
- with ac_api_client(acc) as api:
- for room in Room.objects.filter(lastvisited__lt=then):
- logging.debug("room %s was last used %s" % (room.name,humanize.naturalday(room.lastvisited)))
- send_message.apply_async([room.creator,"You have an unused meetingroom at %s" % acc.name ,"Do you still need %s (%s)?" % (room.name,room.permalink())]) \ No newline at end of file