Parent: [ce23a3] (diff)

Child: [2e2106] (diff)

Download this file

hosted_apps_model.py    127 lines (112 with data), 4.8 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import json
from itertools import groupby
import tg
from pylons import c
import sqlalchemy as sa
from .sfx_model import tables as T
class HostedApp(object):
_apps = None
_app_index = {}
def __init__(self, **kw):
for k,v in kw.iteritems():
setattr(self, k, v)
@classmethod
def all(cls):
if cls._apps: return cls._apps
metadata_types = [
'application_url',
'application_admin_url',
'application_docs_url',
'application_function',
'application_desc',
'application_rss_url' ]
from_obj = T.feature_grouping.join(
T.sys_type_description,
sa.and_(
T.sys_type_description.c.type_table_name=='feature_grouping',
T.sys_type_description.c.type_column_name=='feature_type',
T.sys_type_description.c.type_value==T.feature_grouping.c.feature_type))
from_obj = from_obj.join(
T.object_metadata,
sa.and_(
T.feature_grouping.c.feature_grouping==T.object_metadata.c.target_pk,
T.object_metadata.c.metadata_type.in_(metadata_types)))
q = sa.select([
T.feature_grouping.c.feature_type,
T.sys_type_description.c.type_description,
T.object_metadata.c.metadata_type,
T.object_metadata.c.metadata_value],
order_by=[T.feature_grouping.c.feature_type],
from_obj=from_obj)
cls._apps = []
for (ftype, descr), subiter in groupby(q.execute(), lambda row:row[0:2]):
kwargs = dict(
feature_type=ftype,
application_url=None,
application_admin_url=None,
application_docs_url=None,
application_function=None,
application_desc=None,
application_rss_url=None,
description=descr)
for row in subiter:
kwargs[row[T.object_metadata.c.metadata_type]] = \
row[T.object_metadata.c.metadata_value]
cls._apps.append(cls(**kwargs))
cls._app_index = dict((ha.feature_type, ha) for ha in cls._apps)
return cls._apps
def __repr__(self):
return '<HostedApp %s>' % self.feature_type
@classmethod
def enabled_features(cls, project=None):
if project is None: project = c.project
q = sa.select(
[ T.feature_optin.c.feature_type ],
whereclause=sa.and_(
T.feature_optin.c.owner_table=='project',
T.feature_optin.c.owner_pk==project.get_tool_data('sfx', 'group_id')))
return [r[0] for r in q.execute() ]
@classmethod
def get(cls, feature_type, *args):
cls.all()
return cls._app_index.get(feature_type, *args)
def format_column(self, colname):
value = getattr(self, colname)
value = value.replace('APPTYPE', 'apps')
value = value.replace('INSTANCE', c.project.get_tool_data('sfx', 'unix_group_name'))
value = value.replace('172.29.29.21', tg.config.get('sfx.api.host', 'sourceforge.net'))
return value
def enable(self, user=None, project=None):
if user is None: user = c.user
if project is None: project = c.project
self._queue_ha_operation('hostedapp_create', user, project)
def disable(self, user=None, project=None):
if user is None: user = c.user
if project is None: project = c.project
self._queue_ha_operation('hostedapp_disable', user, project)
def addperm(self, user=None, project=None):
if user is None: user = c.user
if project is None: project = c.project
self._queue_ha_operation('hostedapp_addperm', user, project,
target_table='user',
target_pk=c.user.get_tool_data('sfx', 'userid'))
def _queue_ha_operation(self, op, user, project, **kw):
op_detail = json.dumps(dict(
kw,
hostedapp_name=self.feature_type))
stmt = T.backend_queue.insert(
time_submitted=sa.func.UNIX_TIMESTAMP(),
time_performed=0,
submitter_table='user',
submitter_pk=c.user.get_tool_data('sfx', 'userid'),
target_table='project',
target_pk=project.get_tool_data('sfx', 'group_id'),
operation_type=op,
operation_detail=op_detail,
operation_status_type='pending',
operation_status_detail='')
stmt = T.feature_optin.insert()
stmt.execute(
feature_type=self.feature_type,
owner_table='project',
owner_pk=project.get_tool_data('sfx', 'group_id'))