예제 #1
0
 def _query(self, **kw):
     session = Session()
     user = utils.get_login_user()
     reverse = True if (kw.get("sort_dir", "desc") == "desc") else False
     results = []
     domain_status = self.item_status_filter(kw)
     for domain_class, status in domain_status.iteritems():
         if IDoc.implementedBy(domain_class):
             query = session.query(domain_class).filter(
                 domain_class.status.in_(status)
             ).enable_eagerloads(False).join(
                 domain.UserSubscription).filter(
                     domain.UserSubscription.principal_id == user.user_id)
             query = self.filter_group(query, domain_class, kw)
             query = self.filter_title(query, domain_class, kw)
             #filter on status_date
             query = self.filter_status_date(query, domain_class, kw)
             query = self.order_query(query, domain_class, kw, reverse)
             results.extend(query.all())
     count = len(results)
     if (kw.get("sort_on", None) and kw.get("sort_dir", None)):
         results.sort(key=lambda x: getattr(x, str(kw.get("sort_on"))),
                      reverse=reverse)
     return (results, count)
예제 #2
0
 def __call__(self):
     session = Session()
     try:
         parameters = self.process_parameters()
     except OAuthException as e:
         return bad_request(self.context, self.request, e)
     authorization_token = parameters["authorization_token"]
     if parameters["grant_type"] == "authorization_code":
         authorization_token.expiry = datetime.now()
     access_token = domain.OAuthAccessToken()
     access_token.access_token = get_key()
     access_token.authorization_token = authorization_token
     t_delta = timedelta(seconds=capi.oauth_access_token_expiry_time())
     access_token.expiry = datetime.now() + t_delta
     session.add(access_token)
     session.flush()
     data = {
         "access_token": access_token.access_token,
         "token_type": "bearer",
         "expires_in": capi.oauth_access_token_expiry_time(),
         "refresh_token": access_token.authorization_token.refresh_token
     }
     misc.set_json_headers(self.request)
     return simplejson.dumps(data)
예제 #3
0
 def update(self):
     user_id = self.context.user_id
     parliament_id = self.context.group_id
     session = Session()
     # add cosigned items
     signed_pi_ids = [
         sgn.item_id for sgn in session.query(domain.Signatory).filter(
             sql.and_(
                 domain.Signatory.user_id == user_id,
                 domain.Signatory.status.in_(
                     get_states("signatory", tagged=["public"])),
             )).all()
     ]
     if len(signed_pi_ids) > 0:
         self.query = self.query.union(
             session.query(domain.ParliamentaryItem).filter(
                 sql.and_(
                     domain.ParliamentaryItem.parliament_id ==
                     parliament_id,
                     domain.ParliamentaryItem.status.in_(self.states),
                     domain.ParliamentaryItem.parliamentary_item_id.in_(
                         signed_pi_ids))))
     self.query = self.query.order_by(
         domain.ParliamentaryItem.parliamentary_item_id.desc())
예제 #4
0
 def title_member(self):
     session = Session()
     context = session.merge(removeSecurityProxy(self.context))
     mp_user = None
     try:
         mp_user = session.query(domain.MemberOfParliament).filter(
             domain.MemberOfParliament.user_id == context.user_id).one()
     except NoResultFound:
         #this user has no associated MP record
         pass
     except MultipleResultsFound:
         # this should not happen
         log.error("Multiple MP objects found for : %s", context.__str__())
     finally:
         if mp_user is None:
             return self.title
     dc_constituency = IDCDescriptiveProperties(mp_user.constituency)
     return _(
         "member_title_with_constituency",
         default=u"Member of Parliament for ${constituency} (${member})",
         mapping={
             "constituency": dc_constituency.title,
             "member": self.title
         })
예제 #5
0
 def constructQuery(self, context):
     session = Session()
     trusted = removeSecurityProxy(context)
     user_id = getattr(trusted, self.value_field, None)
     if user_id:
         query = session.query(
             domain.User).filter(domain.User.user_id == user_id).order_by(
                 domain.User.last_name, domain.User.first_name,
                 domain.User.middle_name)
         return query
     else:
         parliament_id = self._get_parliament_id(trusted)
         if parliament_id:
             query = session.query(MemberOfParliament).filter(
                 sql.and_(MemberOfParliament.group_id == parliament_id,
                          MemberOfParliament.active_p == True)).order_by(
                              MemberOfParliament.last_name,
                              MemberOfParliament.first_name,
                              MemberOfParliament.middle_name)
         else:
             query = session.query(domain.User).order_by(
                 domain.User.last_name, domain.User.first_name,
                 domain.User.middle_name)
     return query
예제 #6
0
 def GET(self):
     session = Session()
     if "name" in self.request.keys():
         group_values = session.query(domain.Group).filter(
             sa.and_(domain.Group.status == "active", 
                      domain.Group.principal_name == self.request["name"])
             ).all()
         data ={}
         if len(group_values) == 1:
             group = group_values[0]
             data = {
                 "principal_name": group.principal_name,
                 "groupid" :  group.principal_name,
                 "title" : group.short_name or u"",
                 "description" : group.description or u"",
                 }
         return self.json_response(data) 
     elif "user_name" in self.request.keys():
         group_values = session.query(domain.Group).filter(
             domain.Group.principal_name == self.request["user_name"]).all()
         data ={}
         if len(group_values) == 1:
             group = group_values[0]
             data =  {
                 "groupid" :  group.principal_name,
                 "title" : group.short_name or u"",
                 "description" : group.description or u"",
                 }
         return self.json_response(data)                
     else:
         group_values = [
             (r.principal_name) for
             r in session.query(domain.Group).filter
             (domain.Group.status == "active").all()
         ]
         return self.json_response(group_values)
예제 #7
0
def deactivateGroupMembers(group):
    """ upon dissolution of a group all group members
    are deactivated and get the end date of the group"""
    session = Session()
    group_id = group.group_id
    end_date = group.end_date
    assert(end_date != None)
    connection = session.connection(domain.Group)
    connection.execute(
        schema.user_group_memberships.update().where(
            rdb.and_(
                schema.user_group_memberships.c.group_id == group_id,
                schema.user_group_memberships.c.active_p == True
            )
        ).values(active_p=False)
    )
    connection.execute(
        schema.user_group_memberships.update().where(
            rdb.and_(
                schema.user_group_memberships.c.group_id == group_id,
                schema.user_group_memberships.c.end_date == None
            )
        ).values(end_date=end_date)
    )
    def deactivateGroupMemberTitles(group):
        group_members = rdb.select([schema.user_group_memberships.c.user_id],
                 schema.user_group_memberships.c.group_id == group_id)
        connection.execute(
            schema.member_titles.update().where(
                rdb.and_( 
                    schema.member_titles.c.membership_id.in_(group_members),
                    schema.member_titles.c.end_date == None
                ) 
            ).values(end_date=end_date)
        )
    deactivateGroupMemberTitles(group)
예제 #8
0
 def handle_save(self, action, data):
     session = Session()
     trusted = removeSecurityProxy(self.context)
     sitting = session.query(domain.GroupSitting).get(trusted.sitting_id)
     if sitting.hansard.media_paths is None:
         media_paths = domain.HansardMediaPaths()
         media_paths.web_optimised_video_path = data[
             'web_optimised_video_path']
         media_paths.audio_only_path = data['audio_only_path']
         media_paths.high_quality_video_path = data[
             'high_quality_video_path']
         media_paths.hansard_id = sitting.hansard.hansard_id
         session.add(media_paths)
     else:
         sitting.hansard.media_paths.web_optimised_video_path = data[
             'web_optimised_video_path']
         sitting.hansard.media_paths.audio_only_path = data[
             'audio_only_path']
         sitting.hansard.media_paths.high_quality_video_path = data[
             'high_quality_video_path']
         session.update(sitting)
     session.commit()
     self._next_url = absoluteURL(self.context, self.request) + "/hansard"
     self.request.response.redirect(self._next_url)
예제 #9
0
 def _query(self):
     principal = get_principal()
     roles = get_principal_roles(principal)
     #Add bungeni.Owner to the roles
     roles.append("bungeni.Owner")
     workspace_tabs = component.getUtility(IWorkspaceTabsUtility)
     domain_status = {}
     for role in roles:
         dom_stat = workspace_tabs.getDomainAndStatuses(role, self.__name__)
         if dom_stat:
             for key in dom_stat.keys():
                 if key in domain_status.keys():
                     domain_status[key].extend(dom_stat[key])
                 else:
                     domain_status[key] = dom_stat[key]
     session = Session()
     results = []
     for domain_class in domain_status.keys():
         query = session.query(domain_class).filter(
             domain_class.status.in_(domain_status[domain_class]))
         results.extend(query.all())
     results.sort(key=lambda x: x.status_date, reverse=True)
     for result in results:
         yield result
예제 #10
0
 def query(self):
     items_query = Session().query(self.domain_class)
     if not IScheduleText.implementedBy(self.domain_class):
         items_query = items_query.filter(
             self.domain_class.status.in_(self.filter_states)
         )
     if len(self.item_filters):
         for (key, value) in self.item_filters.iteritems():
             column = getattr(self.domain_class, key)
             #!+SCHEDULING(mb, Jan-2011) extend query spec to include sql filters
             if "date" in key:
                 if "|" in value:
                     start, end = value.split("|")
                     if start and end:
                         expression = sql.between(column, start, end)
                     elif start:
                         expression = (column>=value)
                     elif end:
                         expression = (column<=value)
                     else:
                         continue
                 else:
                     expression = (column==value)
             else:
                 expression = (column==value)
             items_query = items_query.filter(expression)
     if self.group_filter and not IScheduleText.implementedBy(self.domain_class):
         if hasattr(self.domain_class, "parliament_id") and self.group_id:
             items_query = items_query.filter(
                 self.domain_class.parliament_id==self.group_id
             )
         elif hasattr(self.domain_class, "group_id") and self.group_id:
             items_query = items_query.filter(
                 self.domain_class.group_id==self.group_id
             )
     return tuple(items_query)
예제 #11
0
 def handle_update(self, action, data):
     session = Session()
     self.template_data = []
     sitting = domain.GroupSitting()
     sitting = session.query(domain.GroupSitting).get(data["ids"])
     sitting.start_date = data["start_date"].replace(tzinfo=None)
     sitting.end_date = data["end_date"].replace(tzinfo=None)
     if "language" in data.keys():
         sitting.language = data["language"]
     if "venue" in data.keys():
         sitting.venue_id = data["venue"]
     sitting.short_name = data.get("short_name", None)
     sitting.activity_type = data.get("activity_type", None)
     sitting.meeting_type = data.get("meeting_type", None)
     sitting.convocation_type = data.get("convocation_type", None)
     # set extra data needed by template
     session.flush()
     notify(ObjectModifiedEvent(sitting))
     self.template_data.append({"group_sitting_id": sitting.group_sitting_id, 
                                 "action": "inserted",
                                 "ids": data["ids"]})
     session.flush()
     self.request.response.setHeader('Content-type', 'text/xml')
     return self.xml_template()
예제 #12
0
 def saveDiscussions(self):
     session = Session()
     new_record_keys = []
     domain_model = removeSecurityProxy(self.context.domain_model)
     for record in self.data:
         discussion_text = record.get("body_text", "")
         object_id = record.get("object_id", None)
         if object_id:
             current_record = removeSecurityProxy(
                 self.context.get(getItemKey(object_id))
             )
             current_record.body_text = discussion_text
             session.add(current_record)
             session.flush()
             notify(ObjectModifiedEvent(current_record))
             new_record_keys.append(stringKey(current_record))
         else:
             new_record = domain_model(
                 body_text = discussion_text,
                 language = get_default_language()
             )
             new_record.scheduled_item = removeSecurityProxy(
                 self.context.__parent__
             )
             session.add(new_record)
             session.flush()
             notify(ObjectCreatedEvent(new_record))
             new_record_keys.append(stringKey(new_record))
     records_to_delete = [
         removeSecurityProxy(self.context.get(key))
         for key in self.context.keys() if key not in new_record_keys
     ]
     map(session.delete, records_to_delete)
     map(lambda deleted:notify(ObjectRemovedEvent(deleted)),
         records_to_delete
     )
예제 #13
0
def check_venue_bookings(start, end, venue, sitting=None):
    """
    return all sittings (but sitting if given) a venue is booked for
    in the period
    """
    assert (type(start) == datetime.datetime)
    assert (type(end) == datetime.datetime)
    session = Session()
    b_filter = sql.and_(
        sql.or_(
            sql.between(schema.sitting.c.start_date, start, end),
            sql.between(schema.sitting.c.end_date, start, end),
            sql.between(start, schema.sitting.c.start_date,
                        schema.sitting.c.end_date),
            sql.between(end, schema.sitting.c.start_date,
                        schema.sitting.c.end_date)),
        schema.sitting.c.venue_id == venue.venue_id)
    if sitting:
        if sitting.sitting_id:
            b_filter = sql.and_(
                b_filter, schema.sitting.c.sitting_id != sitting.sitting_id)
    query = session.query(BookedVenue).filter(b_filter)
    venues = query.all()
    return venues
예제 #14
0
def get_available_venues(start, end, sitting=None):
    """get all venues that are not booked for a sitting
    (but sitting if given)
    in the given time period 
    SQL:
    SELECT * 
    FROM venues 
    WHERE venues.venue_id NOT IN (SELECT sitting.venue_id 
        FROM sitting 
        WHERE (sitting.start_date BETWEEN '2000-01-01' AND '2000-01-02' 
            OR sitting.end_date BETWEEN '2000-01-01'  AND '2000-01-02'
            OR '2000-01-01'  BETWEEN sitting.start_date AND sitting.end_date 
            OR '2000-01-02'  BETWEEN sitting.start_date AND sitting.end_date) 
        AND sitting.venue_id IS NOT NULL)
    """
    session = Session()
    query = session.query(domain.Venue)
    b_filter = sql.and_(
        sql.or_(
            sql.between(schema.sitting.c.start_date, start, end),
            sql.between(schema.sitting.c.end_date, start, end),
            sql.between(start, schema.sitting.c.start_date,
                        schema.sitting.c.end_date),
            sql.between(end, schema.sitting.c.start_date,
                        schema.sitting.c.end_date)),
        schema.sitting.c.venue_id != None)
    if sitting:
        if sitting.sitting_id:
            b_filter = sql.and_(
                b_filter, schema.sitting.c.sitting_id != sitting.sitting_id)
    query = query.filter(
        sql.not_(
            schema.venues.c.venue_id.in_(
                sql.select([schema.sitting.c.venue_id]).where(b_filter))))
    venues = query.all()
    return venues
예제 #15
0
 def validate(self, action, data):
     # submitted data is actually updated in following call to super.validate
     # !+PASTDATAENTRY(mr, jun-2011) enhancement? see Issue 612 Comment 6:
     # unrequire, allow active_date=None, 
     # get_effective_active_date -> last workflow non-None active_date
     errors = super(WorkflowActionViewlet, self).validate(action, data)
     if "date_active" in data.keys():
         min_date_active = self.get_min_date_active()
         if data.get("date_active") < min_date_active:
             errors.append(zope.interface.Invalid(
                     _("Active Date is in the past.")))
         elif data.get("date_active") > datetime.datetime.now():
             errors.append(zope.interface.Invalid(
                     _("Active Date is in the future.")))
     if "registry_number" in data.keys():
         reg_number = data.get("registry_number")
         if reg_number:
             session = Session()
             num = session.query(Doc
                     ).filter(Doc.registry_number==reg_number).count()
             if num != 0:
                 errors.append(zope.interface.Invalid(
                     "This registry number is already taken."))
     return errors
예제 #16
0
 def handle_publish(self, action, data):
     self.generated_content = self.generateContent(data)
     
     if not hasattr(self.context, "group_id"):
         context_group_id = ISchedulingContext(self.context).group_id
     else:
         context_group_id = self.context.group_id
     
     report = domain.Report(
         short_title=self.title,
         start_date=self.start_date,
         end_date=self.end_date,
         body=self.generated_content,
         owner_id=get_db_user_id(), # !+GROUP_AS_OWNER
         language=self.language,
         group_id=context_group_id
     )
     session = Session()
     session.add(report)
     session.flush()
     notify(ObjectCreatedEvent(report))
     self.status = _(u"Report has been processed and saved")
     
     return self.template()
예제 #17
0
def get_unavailable_venues( start, end, sitting = None ):
    """
    get all venues that are  booked 
    in the given time period
    """
    assert( type(start) == datetime.datetime )
    assert( type(end) == datetime.datetime )
    session = Session()
    b_filter = sql.or_( 
                    sql.between(schema.sittings.c.start_date, start, end), 
                    sql.between(schema.sittings.c.end_date, start, end),
                    sql.between(start, schema.sittings.c.start_date, 
                                schema.sittings.c.end_date),
                    sql.between(end, schema.sittings.c.start_date, 
                                schema.sittings.c.end_date)
                    )
    if sitting:
        if sitting.sitting_id:
            b_filter = sql.and_(b_filter,
                        schema.sittings.c.sitting_id != sitting.sitting_id)
    query = session.query(BookedVenue).filter(b_filter)
    venues = query.all()
    #session.close()
    return venues
예제 #18
0
 def title_member(self):
     context = _merged(self.context)
     mp_user = None
     try:
         mp_user = Session().query(domain.MemberOfParliament).filter(
             domain.MemberOfParliament.user_id == context.user_id).one()
     except NoResultFound:
         #this user has no associated MP record
         pass
     except MultipleResultsFound:
         # this should not happen
         log.error("Multiple MP objects found for : %s", context.__str__())
     finally:
         if mp_user is None:
             return self.title
     if mp_user.representation:
         return _("member_title_with_representation",
                  default=u"Member of Parliament for ${representation}"
                  " (${member})",
                  mapping={
                      "representation": mp_user.representation,
                      "member": self.title
                  })
     return self.title
예제 #19
0
 def _query(self, **kw):
     principal = get_principal()
     roles = get_workspace_roles(principal)
     group_roles_domain_status = self.item_status_filter(kw, roles)
     session = Session()
     results = []
     for domain_class, status in group_roles_domain_status.iteritems():
         query = session.query(domain_class).filter(
             domain_class.status.in_(status))
         if kw.get("filter_short_name", None):
             column = self.title_column(domain_class)
             query = query.filter("""(lower(%s) LIKE '%%%s%%')""" %
                                  (column, kw["filter_short_name"].lower()))
         results.extend(query.all())
     object_roles_domain_status = self.item_status_filter(kw, OBJECT_ROLES)
     for domain_class, status in object_roles_domain_status.iteritems():
         query = session.query(domain_class).filter(
             domain_class.status.in_(status))
         if kw.get("filter_short_name", None):
             column = self.title_column(domain_class)
             query = query.filter("""(lower(%s) LIKE '%%%s%%')""" %
                                  (column, kw["filter_short_name"]))
         for obj in query.all():
             prm = IPrincipalRoleMap(obj)
             for obj_role in OBJECT_ROLES:
                 if (prm.getSetting(obj_role, principal.id) == Allow
                         and obj not in results):
                     results.append(obj)
                     break
     # Sort items
     if kw.get("sort_on", None):
         if kw.get("sort_dir", None):
             rev = True if (kw.get("sort_dir") == "desc") else False
             results.sort(key=lambda x: getattr(x, str(kw.get("sort_on"))),
                          reverse=rev)
     return results
예제 #20
0
 def title(self):
     session = Session()
     context = session.merge(removeSecurityProxy(self.context))
     return self.translate(context, "title_name")
예제 #21
0
 def mover(self):
     session = Session()
     context = session.merge(removeSecurityProxy(self.context))
     return translate_i18n(
         IDCDescriptiveProperties(context.owner).title_member)
예제 #22
0
 def description(self):
     session = Session()
     context = session.merge(removeSecurityProxy(self.context))
     return u"%s  (%s)" % (context.file_name, context.file_mimetype)
예제 #23
0
 def uri(self):
     session = Session()
     context = session.merge(removeSecurityProxy(self.context))
     return (context.uri or "") if hasattr(context, "uri") else ""
예제 #24
0
 def description(self):
     session = Session()
     context = session.merge(removeSecurityProxy(self.context))
     return u"%s %s to %s" % (translate_i18n(
         _(u"Covers")), context.start_date.strftime('%Y-%m-%d'),
                              context.end_date.strftime('%Y-%m-%d'))
예제 #25
0
 def title(self):
     session = Session()
     context = session.merge(removeSecurityProxy(self.context))
     return context.file_title
예제 #26
0
 def title(self):
     session = Session()
     context = session.merge(removeSecurityProxy(self.context))
     return u'%s: %s - %s' % (self.translate(
         context, "short_name"), context.start_date, context.end_date)
예제 #27
0
 def title(self):
     session = Session()
     context = session.merge(removeSecurityProxy(self.context))
     return '%s - %s ' % (self.translate(context.item, "short_name"),
                          self.translate(context.group, "short_name"))
예제 #28
0
 def title(self):
     session = Session()
     context = session.merge(removeSecurityProxy(self.context))
     return '%s - %i' % (self.translate(context.constituency,
                                        "name"), context.date.year)
예제 #29
0
 def description(self):
     session = Session()
     context = session.merge(removeSecurityProxy(self.context))
     return self.translate(context, "full_name")
예제 #30
0
 def status(self):
     session = Session()
     context = session.merge(removeSecurityProxy(self.context))
     return translate_i18n(misc.get_wf_state(context))