def u30to31StorePastStats(objContext, blnSkip = False): """ Done as upgrade from 3.0 to 3.1 Gather data that is easy and reliable accessible: * Payments * Messages sent (advert/non-advert) * Expiries * Members joining""" # Create empty dictionary (date:eventtype:count) # Go through members, count events found # Go through messages, count them # Store results # (notes: some records may already exists, if so add new properties, otherwise create new record) if blnSkip: print "Skipped: Get and store past statistics" return print "Get and store past statistics" dictStats = {} objMembers = GetDataFolder(objContext, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): # Check starting date if objMember.ImportedFromMailman: for objPeriod in objMember.FromMailman.objectValues('E3Period'): if objPeriod.PeriodType == "Free": AddPastStat(dictStats, objPeriod.GetStartDate(), "JoinedYesterday") else: AddPastStat(dictStats, objMember.GetCreatedDate(), "JoinedYesterday") # Get payments for objPayment in objMember.Historic.objectValues("E3Payment"): AddPastStat(dictStats, objPayment.GetDate(), "PaymentYesterday") for objEvent in objMember.Historic.objectValues("E3Event"): if objEvent.EventType == "ExpiryMessageSent": AddPastStat(dictStats, objEvent.GetDate(), "ExpiredYesterday") # Now do the message count objMessages = GetDataFolder(objContext, 'E3Messages') for objYear in objMessages.objectValues('Folder'): print objYear.id for objMonth in objYear.objectValues('Folder'): print objMonth.id for objMessage in objMonth.objectValues('Folder'): dtmDate = date(year = objMessage.mailDate.year(), month = objMessage.mailDate.month(), day = objMessage.mailDate.day()) if 'adv' in objMessage.mailSubject.lower(): AddPastStat(dictStats, dtmDate, "AdvertPostedYesterday") else: AddPastStat(dictStats, dtmDate, "NonAdvertPostedYesterday") SaveStats(objContext, dictStats)
def AddPropertyToOfferings(objHere, strPropertyName, varDefault, strType): objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): for objOffering in objMember.Offerings.objectValues("E3Offering"): if not strPropertyName in objOffering.propertyIds(): objOffering.manage_addProperty(strPropertyName, varDefault, strType)
def UsernameExists(objHere, strUsername): objMembers = GetDataFolder(objHere, "E3Member") for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): if objMember.Username.lower() == strUsername.lower(): return True return False
def SaveStats(objContext, dictStats): print "Saving stats" # Update all existing stats objStats = GetDataFolder(objContext, "E3ListStat") for objStat in objStats.objectValues("E3ListStat"): dtmDate = objStat.GetDateOfCount() if dictStats.has_key(dtmDate): for strItem in ("JoinedYesterday", "PaymentYesterday", "ExpiredYesterday", "AdvertPostedYesterday", "NonAdvertPostedYesterday"): if not objStat.hasProperty(strItem): objStat.manage_addProperty(strItem, dictStats[dtmDate][strItem], 'int') del(dicStats[dtmDate]) for strItem in cnStatsList: if not objStat.hasProperty(strItem): objStat.manage_addProperty(strItem, 0, "int") dodListStat = GetDOD(objContext, "E3ListStat") for dtmDate in dictStats.keys(): objStat = dodListStat.NewObject() objStat.SetDateOfCount(dtmDate) for strItem in ("JoinedYesterday", "PaymentYesterday", "ExpiredYesterday", "AdvertPostedYesterday", "NonAdvertPostedYesterday"): if dictStats[dtmDate].has_key(strItem): objStat.manage_addProperty(strItem, dictStats[dtmDate][strItem], 'int') for strItem in cnStatsList: if not objStat.hasProperty(strItem): objStat.manage_addProperty(strItem, 0, "int")
def ExtractEmailAddresses(objHere): """Processes all messages""" # objUnknownMember = SearchOne(objHere, 'E3Member', 'Username', 'Unknown') # if not objUnknownMember: # objDataObjectDefinition = GetDataFolder(objHere, 'DataObjectDefinitions').E3Member # objUnknownMember = objDataObjectDefinition.NewObject() # objUnknownMember.Username = '******' objArchive = GetDataFolder(objHere, 'E3Messages') objEmailAddresses = GetDataFolder(objHere, 'E3EmailAddress') objMembers = GetDataFolder(objHere, 'E3Member') dictAllEmailAddresses = GetAllEmailAddresses(objMembers, objEmailAddresses.Catalogue) dodMember = GetDOD(objHere, 'E3Member') dodEmailAddress = GetDOD(objHere, 'E3EmailAddress') intDone = 0 for objYear in objArchive.objectValues(): for objMonth in objYear.objectValues(): for objThread in objMonth.objectValues(): dictAllEmailAddresses = ExtractOneAddress(objThread, dictAllEmailAddresses, dodMember, dodEmailAddress) intDone = intDone + 1 # if intDone > 100: # return "done" for objMessage in objThread.objectValues('Folder'): intDone = intDone + 1 dictAllEmailAddresses = ExtractOneAddress(objMessage, dictAllEmailAddresses, dodMember, dodEmailAddress) return "%s done" % intDone
def ConvertNameToUstring(objHere): objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): strName = ToUnicode(objMember.Name) objMember.manage_delProperties(("Name", )) objMember.manage_addProperty("Name", strName, "ustring")
def ParkingAccounts(objHere): objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): if objMember.GetNextExpiryFromMailman() < cnFirstDate: if objMember.Name <> 'Unknown': print objMember.Name
def RemindToConfirm(objHere): objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): if objMember.VisitCount < 2: objMember.RemindToConfirm() return "Done"
def RemoveProfessionalName(objHere): objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): if "FullName" in objMember.objectIds(): if not objMember.Name: objMember.Name = objMember.FullName
def ChangeEmailSettings(objHere): # Old setting: # (member).ListMemberships.ECL.myDeliveryMode # (member).ListMemberships.ECL.EmailAddress # New settings: # (member).EmailDigestMode # (member).EmailFrequency-ECL # (member).EmailDeliveryAddress # Unchanged: # (member).NoMail # (member).ContactEmailAddress # Might happen later: # (member).EmailFrequency-ECL-Adverts, etc objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): if not objMember.hasProperty("EmailDigestMode"): strDeliveryMode = objMember.ListMemberships.ECL.GetDeliveryMode() strEmailAddress = objMember.ListMemberships.ECL.EmailAddress objMember.manage_addProperty("EmailDeliveryAddress", strEmailAddress, "ustring") if "Digest" in strDeliveryMode: strFrequency = "Daily" strDigestMode = strDeliveryMode else: strFrequency = "Direct" strDigestMode = "StructuredDigest" objMember.manage_addProperty("EmailDigestMode", strDigestMode, "string") objMember.manage_addProperty("EmailFrequency_ECL", strFrequency, "string")
def PostFixCheck(objHere): strResult = """<fieldset> <legend>Post-fix check</legend>""" strResult += "<ol>\n" objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): if "ListMemberships" in objMember.objectIds(): if "ECL" in objMember.ListMemberships.objectIds(): strOldDeliveryMode = objMember.ListMemberships.ECL.myDeliveryMode strOldDeliveryAddress = objMember.ListMemberships.ECL.EmailAddress strDeliveryFrequency = objMember.EmailFrequency_ECL strDigestMode = objMember.EmailDigestMode strDeliveryAddress = objMember.EmailDeliveryAddress if strOldDeliveryMode == "NoMail" and strDeliveryFrequency == "Direct" and objMember.NoMail: pass elif strOldDeliveryMode == "Direct" and strDeliveryFrequency == "Direct" and strDigestMode == "StructuredDigest": pass elif strOldDeliveryMode in ["MIMEDigest", "TextDigest", "StructuredDigest", "TopicsList"] and strDeliveryFrequency == "Daily" and strDigestMode == strOldDeliveryMode: pass else: strResult += "<li>%s, from %s to %s - %s</li>" % (objMember.id, strOldDeliveryMode, strDeliveryFrequency, strDigestMode) strResult += "</ol>\n" strResult += "</fieldset>" return strResult
def ListUnconfirmedMembers(objHere): lstAddresses = [] lstMembershipTypes = [] objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): if not objMember.MembershipType in lstMembershipTypes: lstMembershipTypes.append(objMember.MembershipType) if objMember.MembershipType == "Full" and not objMember.HasConfirmedEmailAddress: lstAddresses.append(objMember) strAddresses = "" for objMember in lstAddresses: strAddresses += '<li>%s (%s)</li>\n' % (objMember.EmailDeliveryAddress, objMember.id) strMembershipTypes = "" for strMembershipType in lstMembershipTypes: strMembershipTypes += "<li>%s</li>\n" % strMembershipType strResult = """ <h2>Membership types</h2> <ol> %s </ol> <h2>Members without confirmed email addresses</h2> <ol> %s </ol> """ % (strMembershipTypes, strAddresses) return strResult
def u32to33AddProfileProperties(objHere, blnSkip = False): if blnSkip: print "Skipping: AddProfileProperties" return objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): AddProperties(objMember, (('FullName', '', 'ustring'), ('TagLine', '', 'ustring'), ('Biography', '', 'utext'), ('Testimonials', '', 'utext'), ('Country', '', 'ustring'), ('Location', '', 'ustring'), ('Postcode', '', 'ustring'), ('CommercialComments', '', 'utext'), ('CommunityComments', '', 'utext'), ('ContactEmailAddress', '', 'ustring'), ('PhoneNumber', '', 'ustring'), ('Languages', '', 'utext'), ('WebsiteAddress', '', 'ustring'), ('HostOfChapter', '', 'ustring'), ('ShowFullName', 'Hide', 'string'), ('ShowCountry', 'Hide', 'string'), ('ShowLocation', 'Hide', 'string'), ('ShowPostcode', 'Hide', 'string'), ('ShowEmailAddress', 'Hide', 'string'), ('ShowPhoneNumber', 'Hide', 'string'), ('ShowBiography', 'Hide', 'string'), ('ShowCommunityComments', 'Hide', 'string')))
def CountBookReviews(objHere): objBooks = GetDataFolder(objHere, 'MCIBook') intResult = 0 for objBatch in objBooks.objectValues(): for objBook in objBatch.objectValues('MCIBook'): if objBook.Review: intResult = intResult + 1 return intResult
def CategoryNamesSelected(objHere, objQuery): lstResult = [] objCategories = GetDataFolder(objHere, 'MCIBookCategory') for objCategory in objCategories.objectValues(): if objQuery.has_key('BookCategory' + objCategory.id): lstResult.append(objCategory.CategoryName) for objSubCategory in objCategory.objectValues(): if objQuery.has_key('BookCategory' + objSubCategory.id): lstResult.append(objSubCategory.CategoryName) objReaderCategories = GetDataFolder(objHere, 'MCIReaderCategory') for objReaderCategory in objReaderCategories.objectValues(): if objQuery.has_key('ReaderCategory' + objReaderCategory.id): lstResult.append(objReaderCategory.CategoryName) strResult = ", ".join(lstResult) return strResult
def HasDuplicateBookings(objHere): objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): if len(objMember.Events.objectValues("E3Conf08Booking")) > 1: print "Duplicates for: ", objMember.id return True return False
def ChangeFromMembersOnly(objHere): objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): for strField in ('ShowCountry', 'ShowLocation', 'ShowPostcode', 'ShowEmailAddress', 'ShowPhoneNumber', 'ShowBiography', 'ShowFullName', 'ShowCommunityComments'): strValue = objMember.getProperty(strField) if strValue == "MembersOnly": objMember.setProperty(strField, "Members")
def GenerateTestData3p1(objContext): # Set 'Private' property to True/False at random objArchive = GetDataFolder(objContext, 'E3Messages') for objYear in objArchive.objectValues('Folder'): for objMonth in objYear.objectValues('Folder'): for objMessage in objMonth.objectValues('Folder'): objMessage.Private = random.choice((True, False))
def CountBooksForCategories(objHere): print "Counting books for categories" objCategories = GetDataFolder(objHere, 'MCIBookCategory') for objCategory in objCategories.objectValues('MCIBookCategory'): objCategory.BooksInCategory = CountBooksForOneCategory(objCategory) print objCategory.CategoryName, objCategory.BooksInCategory for objSubCategory in objCategory.objectValues('MCIBookCategory'): objSubCategory.BooksInCategory = CountBooksForOneCategory(objSubCategory) print objSubCategory.CategoryName, objSubCategory.BooksInCategory
def UpgradeTo3p8p4(objHere): print "Upgrading to 3.8.4" print "New EmailFrequency_ECL_Advert property" objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): if not "EmailFrequency_ECL_Advert" in objMember.propertyIds(): objMember.manage_addProperty("EmailFrequency_ECL_Advert", "SameAsMain", "string") CreateNewListMembers(objHere)
def FindPrivateMessages(objHere): strResult = "<ul>" objArchive = GetDataFolder(objHere, 'E3Messages') for objYear in objArchive.objectValues('Folder'): for objMonth in objYear.objectValues('Folder'): for objMessage in objMonth.objectValues('Folder'): if not ValidPrefix(objMessage.mailSubject): strResult += """<a href="/Archive/ViewThread?ThreadId=%s"><li>%s</li></a>\n""" % (objMessage.id, objMessage.mailSubject) strResult += "</ul>"
def CountMembers(objHere): intResult = 0 objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): if objMember.Live() and not objMember.ParkingMember(): intResult = intResult + 1 objData = GetDataFolder(objHere, 'E3Data') objData.MembersCount = intResult
def HasFutureMasterclasses(objHere): objMasterclasses = GetDataFolder(objHere, 'MCIMasterclass') dtmNow = datetime.datetime.today() for objMasterclass in objMasterclasses.objectValues('MCIMasterclass'): if not objMasterclass.Cancelled: dtmClassDate = datetime.datetime(year = objMasterclass.ClassDate.year(), month = objMasterclass.ClassDate.month(), day = objMasterclass.ClassDate.day()) if dtmClassDate >= dtmNow: return True return False
def SearchHelp(objHere, strSearchText): objHelpFolder = GetDataFolder(objHere, 'E3Help') lstResult = [] for objHelp in objHelpFolder.objectValues('E3Help'): if not objHelp.Type == 'Rules' and \ (strSearchText in " ".join(objHelp.Lines).lower() or strSearchText in objHelp.title): lstResult.append((objHelp.title, """<li><a href="/Help/ShowOne?Id=%s">%s</a></li>\n""" % (objHelp.HelpId, objHelp.title))) return PresentWebTree(lstResult)
def ExtensiveMembersSearch(objHere, strSearchFor): lstResult = [] strSearchFor = strSearchFor.lower() objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): if objMember.ContainsString(strSearchFor): lstResult.append(objMember) return lstResult
def ECLMasterclassesSideBar(objHere): objMasterclasses = GetDataFolder(objHere, 'MCIMasterclass') dtmNow = datetime.datetime.today() lstComing = [] lstPast = [] for objMasterclass in objMasterclasses.objectValues('MCIMasterclass'): if not objMasterclass.Cancelled: dtmClassDate = datetime.datetime(year = objMasterclass.ClassDate.year(), month = objMasterclass.ClassDate.month(), day = objMasterclass.ClassDate.day()) if dtmClassDate >= dtmNow: lstComing.append(objMasterclass) else: lstPast.append(objMasterclass) if lstComing: lstComing.sort(RecentMasterclasses) strComing = "" for objComing in lstComing: strComing = strComing + ListOneComingMasterclass(objComing) strComing = """<ul> %s </ul>""" % strComing else: strComing = """<p>By <a href = "http://www.MentorCoaches.com">Mentor Coaches International</a></p>""" intRecordings = 0 strRecordings = "" intNotes = 0 strNotes = "" lstPast.sort(RecentMasterclasses) for objPast in lstPast: if objPast.ClassRecording: if intRecordings < 3: strRecordings = strRecordings + ListOneRecording(objPast) intRecordings = intRecordings + 1 if objPast.Notes: if intNotes < 3: strNotes = strNotes + ListOneNotes(objPast) intNotes = intNotes + 1 strResult = """ <h1>Masterclasses</h1> %(Coming)s <h2>Recordings</h2> <ul> %(Recordings)s </ul> <p><a href="http://%(Root)s/Masterclasses/Past" target="_blank">More ...</a></p> <h2>Notes</h2> <ul> %(Notes)s </ul> <p><a href="http://%(Root)s/Masterclasses/Past" target="_blank">More ...</a></p> """ % {'Coming': strComing, 'RecordingsCount': intRecordings, 'Recordings': strRecordings, 'NotesCount': intNotes, 'Notes': strNotes, 'Root': cnMCIRoot} return strResult
def AddNewProperties3p5p4(objHere): objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): AddProperties(objMember, ( ('NoCommercialEmails', False, 'boolean'), ('DuplicateMembership', False, 'boolean'), ('DoLaterDone', [], 'lines') ))
def FindIncorrectPaymentFlags(objHere): strResult = "" objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): if objMember.Historic.objectValues('E3Payment') and not objMember.HasPayments: strResult += """<p>%s</p>\n""" % objMember if objMember.HasPayments and not objMember.Historic.objectValues('E3Payment'): strResult += """<p>%s</p>\n""" % objMember return strResult
def NewsletterList(objHere): dictNewsletters = {} objNewsletters = GetDataFolder(objHere, 'MCINewsletter') for objNewsletter in objNewsletters.objectValues('MCINewsletter'): dictNewsletters[objNewsletter.IssueNumber] = FormatOneNewsletter(objNewsletter) strResult = "" lstIssues = dictNewsletters.keys() lstIssues.sort() for intIssue in lstIssues: strResult = strResult + dictNewsletters[intIssue] return """<span class="PageTitle2">"The Mentor Coach" - Newsletter Archive</span><br>""" + strResult
def FindTodaysWnE(objHere): dtmNow = datetime.date.today() strResult = "" objMembers = GetDataFolder(objHere, 'E3Member') for objBatch in objMembers.objectValues('Folder'): for objMember in objBatch.objectValues('E3Member'): for objEvent in objMember.Historic.objectValues('E3Event'): print ".", if objEvent.GetDate() == dtmNow : strResult += "%s; " % objMember.PreferredEmailAddress() print return strResult