def attendees(self): """Appointment :class:`attendees <Attendee>`.""" # Filter out organizer from all recipients restriction = Restriction( SOrRestriction([ SNotRestriction(SExistRestriction(PR_RECIPIENT_FLAGS)), SBitMaskRestriction(BMR_EQZ, PR_RECIPIENT_FLAGS, recipOrganizer) ])) for row in self.table(PR_MESSAGE_RECIPIENTS, restriction=restriction): yield Attendee(self.server, row)
def restriction(self, type_, store): if self.field: # determine proptag for term, eg 'subject' proptag = TYPE_KEYWORD_PROPMAP[type_][self.field] flag = None subobj = None recipient_type = None # property in sub-object (attachments/recipient): use sub-restriction if isinstance(proptag, tuple) and len(proptag) == 2: if(proptag[0]) == PR_MESSAGE_ATTACHMENTS: subobj, proptag = proptag elif(proptag[0]) == PR_MESSAGE_RECIPIENTS: subobj, recipient_type = proptag proptag = PR_DISPLAY_NAME_W # TODO email else: proptag, flag = proptag # named property: resolve local proptag elif isinstance(proptag, tuple) and len(proptag) == 4: proptag = store._name_id(proptag[:3]) | proptag[3] # comparison operator if self.op in ('<', '>', '>=', '<=', '<>'): if PROP_TYPE(proptag) == PT_SYSTIME: d = dateutil.parser.parse(self.value, dayfirst=True) d = datetime_to_filetime(d) restr = SPropertyRestriction( OP_RELOP[self.op], proptag, SPropValue(proptag, d) ) else: value = self.value unit = '' if [x for x in ('KB', 'MB', 'GB') if value.endswith(x)]: value, unit = value[:-2], value[-2:] if PROP_TYPE(proptag) in (PT_FLOAT, PT_DOUBLE): value = float(value) else: value = int(value) if unit == 'KB': value *= 1024 elif unit == 'MB': value *= 1024**2 elif unit == 'GB': value *= 1024**3 restr = SPropertyRestriction( OP_RELOP[self.op], proptag, SPropValue(proptag, value) ) # contains/equals operator elif self.op in (':', '='): if PROP_TYPE(proptag) == PT_UNICODE: restr = SContentRestriction( FL_SUBSTRING | FL_IGNORECASE, proptag, SPropValue(proptag, self.value) ) elif flag or PROP_TYPE(proptag) == PT_BOOLEAN: if flag: restr = SBitMaskRestriction( BMR_NEZ if self.value in ('yes', 'true') else BMR_EQZ, proptag, flag ) else: restr = SPropertyRestriction( RELOP_EQ, proptag, SPropValue(proptag, self.value in ('yes', 'true')) ) elif PROP_TYPE(proptag) == PT_MV_UNICODE: proptag2 = (proptag ^ PT_MV_UNICODE) | PT_UNICODE # funky! restr = SContentRestriction( FL_SUBSTRING | FL_IGNORECASE, proptag, SPropValue(proptag2, self.value) ) elif PROP_TYPE(proptag) in (PT_SHORT, PT_LONG, PT_LONGLONG, PT_FLOAT, PT_DOUBLE): conv = float if PROP_TYPE(proptag) in (PT_FLOAT, PT_DOUBLE) else int if '..' in self.value: val1, val2 = self.value.split('..') restr = SAndRestriction([ SPropertyRestriction( RELOP_GE, proptag, SPropValue(proptag, conv(val1)) ), SPropertyRestriction( RELOP_LT, proptag, SPropValue(proptag, conv(val2)) ) ]) else: restr = SPropertyRestriction( RELOP_EQ, proptag, SPropValue(proptag, conv(self.value)) ) elif PROP_TYPE(proptag) == PT_SYSTIME: if self.value == 'today': d = datetime.datetime.now().date() d2 = d + datetime.timedelta(days=1) restr = _interval_restriction(proptag, d, d2) elif self.value == 'yesterday': d2 = datetime.datetime.now().date() d = d2 - datetime.timedelta(days=1) restr = _interval_restriction(proptag, d, d2) elif self.value == 'this week': d2 = datetime.datetime.now() d = d2.date() - datetime.timedelta(days=d2.weekday()) restr = _interval_restriction(proptag, d, d2) elif self.value == 'this month': d2 = datetime.datetime.now() d = d2.date() - datetime.timedelta(days=d2.day-1) restr = _interval_restriction(proptag, d, d2) elif self.value == 'last month': now = datetime.datetime.now() d2 = now.date() - datetime.timedelta(days=now.day-1) d = (d2 - datetime.timedelta(days=1)).replace(day=1) restr = _interval_restriction(proptag, d, d2) elif self.value == 'this year': d2 = datetime.datetime.now() d = datetime.datetime(d2.year, 1, 1) restr = _interval_restriction(proptag, d, d2) elif self.value == 'last year': now = datetime.datetime.now() d2 = datetime.datetime(now.year, 1, 1) d = datetime.datetime(d2.year-1, 1, 1) restr = _interval_restriction(proptag, d, d2) elif '..' in self.value: date1, date2 = self.value.split('..') # TODO hours etc d = dateutil.parser.parse(date1, dayfirst=True) d2 = dateutil.parser.parse(date2, dayfirst=True) restr = _interval_restriction(proptag, d, d2) else: d = dateutil.parser.parse(self.value, dayfirst=True) # TODO hours etc d2 = d + datetime.timedelta(days=1) restr = _interval_restriction(proptag, d, d2) # turn restriction into sub-restriction if subobj: if recipient_type is not None: restr = SAndRestriction([ restr, SPropertyRestriction( RELOP_EQ, PR_RECIPIENT_TYPE, SPropValue(PR_RECIPIENT_TYPE, recipient_type) ) ]) restr = SSubRestriction(subobj, restr) else: defaults = [(store._name_id(proptag[:3]) | proptag[3]) if isinstance(proptag, tuple) else proptag for proptag in DEFAULT_PROPTAGS[type_]] restr = SOrRestriction([ SContentRestriction( FL_SUBSTRING | FL_IGNORECASE, p, SPropValue(p, self.value) ) for p in defaults ]) if self.sign == '-': restr = SNotRestriction(restr) return restr
def prop_restriction(self, proptag, flag): # comparison operator if self.op in ('<', '>', '>=', '<=', '<>'): if PROP_TYPE(proptag) == PT_SYSTIME: d = dateutil.parser.parse(self.value) d = datetime_to_filetime(d) restr = SPropertyRestriction( OP_RELOP[self.op], proptag, SPropValue(proptag, d) ) else: value = self.value unit = '' if [x for x in ('KB', 'MB', 'GB') if value.endswith(x)]: value, unit = value[:-2], value[-2:] value = int(value) if unit == 'KB': value *= 1024 elif unit == 'MB': value *= 1024**2 elif unit == 'GB': value *= 1024**3 restr = SPropertyRestriction( OP_RELOP[self.op], proptag, SPropValue(proptag, value) ) # contains/equals operator elif self.op in (':', '='): if PROP_TYPE(proptag) == PT_UNICODE: restr = SContentRestriction( FL_SUBSTRING | FL_IGNORECASE, proptag, SPropValue(proptag, self.value) ) elif flag or PROP_TYPE(proptag) == PT_BOOLEAN: if flag: restr = SBitMaskRestriction( BMR_NEZ if self.value in ('yes', 'true') else BMR_EQZ, proptag, flag ) else: restr = SPropertyRestriction( RELOP_EQ, proptag, SPropValue(proptag, self.value in ('yes', 'true')) ) elif PROP_TYPE(proptag) == PT_MV_UNICODE: proptag2 = (proptag ^ PT_MV_UNICODE) | PT_UNICODE # funky! restr = SContentRestriction( FL_SUBSTRING | FL_IGNORECASE, proptag, SPropValue(proptag2, self.value) ) elif PROP_TYPE(proptag) in (PT_SHORT, PT_LONG, PT_LONGLONG, PT_FLOAT, PT_DOUBLE): conv = float if PROP_TYPE(proptag) in (PT_FLOAT, PT_DOUBLE) else int if '..' in self.value: val1, val2 = self.value.split('..') restr = SAndRestriction([ SPropertyRestriction( RELOP_GE, proptag, SPropValue(proptag, conv(val1)) ), SPropertyRestriction( RELOP_LT, proptag, SPropValue(proptag, conv(val2)) ) ]) else: restr = SPropertyRestriction( RELOP_EQ, proptag, SPropValue(proptag, conv(self.value)) ) elif PROP_TYPE(proptag) == PT_SYSTIME: if self.value == 'today': d = datetime.datetime.now().date() d2 = d + datetime.timedelta(days=1) restr = _interval_restriction(proptag, d, d2) elif self.value == 'yesterday': d2 = datetime.datetime.now().date() d = d2 - datetime.timedelta(days=1) restr = _interval_restriction(proptag, d, d2) elif self.value == 'this week': d2 = datetime.datetime.now() d = d2.date() - datetime.timedelta(days=d2.weekday()) restr = _interval_restriction(proptag, d, d2) elif self.value == 'this month': d2 = datetime.datetime.now() d = d2.date() - datetime.timedelta(days=d2.day-1) restr = _interval_restriction(proptag, d, d2) elif self.value == 'last month': now = datetime.datetime.now() d2 = now.date() - datetime.timedelta(days=now.day-1) d = (d2 - datetime.timedelta(days=1)).replace(day=1) restr = _interval_restriction(proptag, d, d2) elif self.value == 'this year': d2 = datetime.datetime.now() d = datetime.datetime(d2.year, 1, 1) restr = _interval_restriction(proptag, d, d2) elif self.value == 'last year': now = datetime.datetime.now() d2 = datetime.datetime(now.year, 1, 1) d = datetime.datetime(d2.year-1, 1, 1) restr = _interval_restriction(proptag, d, d2) elif '..' in self.value: date1, date2 = self.value.split('..') # TODO hours etc d = dateutil.parser.parse(date1) d2 = dateutil.parser.parse(date2) restr = _interval_restriction(proptag, d, d2) else: d = dateutil.parser.parse(self.value) # TODO hours etc d2 = d + datetime.timedelta(days=1) restr = _interval_restriction(proptag, d, d2) return restr