def createBulkMail(transaction, creatorMember, balanceBefore, balanceNow, lang): debtorsTxt = '' debtorsHtml = '<ul>' item = _('$%s to %s because of %s', lang) itemTxt = ' * %s\n' % item itemHtml = '<li>%s</li>' % item total = 0.0 for debt in transaction.debts: if transaction.payer.user != debt.member.user: debtorsTxt += itemTxt % (round(debt.money, 2), debt.member.userNick, debt.reason) debtorsHtml += itemHtml % (round(debt.money, 2), debt.member.userNick, debt.reason) total += debt.money debtorsHtml += '</ul>' # Try send email to the debtor message = mail.EmailMessage( sender = DeBeeEmail, to = transaction.payer.user.email(), subject = transactionNoticeSubject(transaction.payer, lang)) global bulkTxt if not (lang in bulkTxt): bulkTxt[lang] = readFile('texts/%s/creator_says_you_payed_for_them.txt' % lang) global bulkHtml if not (lang in bulkHtml): bulkHtml[lang] = readFile('texts/%s/creator_says_you_payed_for_them.html' % lang) message.body = bulkTxt[lang] % (transaction.payer.userNick, creatorMember.userNick, debtorsTxt, round(total, 2), descriptionOfBalance(balanceBefore, True, lang), transaction.payer.groupNick, descriptionOfBalance(balanceNow, False, lang)) message.html = bulkHtml[lang] % (transaction.payer.userNick, creatorMember.userNick, debtorsHtml, round(total, 2), descriptionOfBalanceHtml(balanceBefore, True, lang), transaction.payer.groupNick, descriptionOfBalanceHtml(balanceNow, False, lang)) return message
def __init__(self, config): # keep a reference to the config self.config = config # validate corpus path exists if os.path.exists(config.corpusPath) == False: io.printErrorAndExit("corpus not found at {}".format( config.corpusPath)) # validate that students.txt exists, create array studentText = io.readFile(config.corpusPath + "students.txt") self.students = [] studentText = studentText.strip().split("\n") for student in studentText: self.students.append(student.strip()) # try to load the semester map self.hasSemesters = False self.semesterMap = {} if os.path.exists(config.corpusPath + "semesters.csv"): handle = open(config.corpusPath + "semesters.csv", "r") reader = csv.reader(handle) for row in reader: self.semesterMap[row[0]] = row[1].strip() self.hasSemesters = True
def thirdPartyActionMessageHtml(creator, me, someone, amount, reason, balanceBefore, balanceNow, rejectUrl, body, lang): realBody = body % {'creator': creator.userNick, 'user': me.userNick, 'amount': amount, 'reason': reason} global actionHtml if not (lang in actionHtml): actionHtml[lang] = readFile('texts/%s/action.html' % lang) return actionHtml[lang] % (someone.userNick, realBody, descriptionOfBalanceHtml(balanceBefore, True, lang), someone.groupNick, descriptionOfBalanceHtml(balanceNow, False, lang), rejectUrl)
def _initializeLanguageData(language): global languageData props = {} lines = readFile('locale/%s.properties' % language).split('\n') for line in lines: [key, value] = line.split(':=', 1) props[key] = value.strip() languageData[language] = props
def actionMessageTxt(me, someone, amount, reason, balanceBefore, balanceNow, rejectUrl, body, lang): realBody = body % {'user': me.userNick, 'amount': amount, 'reason': reason} global actionTxt if not (lang in actionTxt): actionTxt[lang] = readFile('texts/%s/action.txt' % lang) return actionTxt[lang] % (someone.userNick, realBody, descriptionOfBalance(balanceBefore, True, lang), someone.groupNick, descriptionOfBalance(balanceNow, False, lang), rejectUrl)
def rejectionMessageHtml(me, someone, tr, reason, balanceBefore, balanceNow, body, lang): if reason != "": reason = '%s<br><br>' % reason realBody = body % {'user': me.userNick, 'amount': tr.amount, 'reason': tr.reason} global rejectionHtml if not (lang in rejectionHtml): rejectionHtml[lang] = readFile('texts/%s/rejection.html' % lang) return rejectionHtml[lang] % (someone.userNick, realBody, reason, descriptionOfBalanceHtml(balanceBefore, True, lang), someone.groupNick, descriptionOfBalanceHtml(balanceNow, False, lang))
def rejectionMessageTxt(me, someone, tr, reason, balanceBefore, balanceNow, body, lang): if reason != "": reason = '\n%s\n' % reason realBody = body % {'user': me.userNick, 'amount': tr.amount, 'reason': tr.reason} global rejectionTxt if not (lang in rejectionTxt): rejectionTxt[lang] = readFile('texts/%s/rejection.txt' % lang) return rejectionTxt[lang] % (someone.userNick, realBody, reason, descriptionOfBalance(balanceBefore, True, lang), someone.groupNick, descriptionOfBalance(balanceNow, False, lang))
def sendInvitation(self, fromUser, toEmail, toGroup, customInvitationText, urlBuilder, lang): invitation = GroupInvitation(toGroup, toEmail, urlBuilder) plainUrl = invitation.getUrl() subject = "De-Bee: You are invited to %s group!" % toGroup.name message = mail.EmailMessage( sender = DeBeeEmail, to = toEmail, subject = subject) if len(customInvitationText) > 0: plainInvitationText = customInvitationText + '\n\n' htmlInvitationText = customInvitationText + '<br><br>' else: plainInvitationText = '' htmlInvitationText = '' invitationText = readFile('texts/%s/invitation.txt' % lang) invitationHtml = readFile('texts/%s/invitation.html' % lang) membersText = '' membersHtml = '<ul>' for member in toGroup.memberships: if member.userNick != member.user.email(): membersText += ' * %s (%s)\n' % (member.userNick, member.user.email()) membersHtml += '<li>%s (%s)</li>' % (member.userNick, member.user.email()) else: membersText += ' * %s\n' % member.userNick membersHtml += '<li>%s</li>' % member.userNick membersHtml += '</ul>' message.body = invitationText % (toEmail, fromUser, toGroup.name, plainInvitationText, membersText, plainUrl) message.html = invitationHtml % (toEmail, fromUser, toGroup.name, htmlInvitationText, membersHtml, plainUrl) try: message.send() except: iHateGoogleAppEngineMailQuotaRules = True
def __init__(self, config): # keep a reference to the config self.config = config # validate corpus path exists if os.path.exists(config.corpusPath) == False: io.printErrorAndExit("corpus not found at {}".format(config.corpusPath)) # validate that students.txt exists, create array studentText = io.readFile(config.corpusPath + "students.txt") self.students = [] studentText = studentText.strip().split("\n") for student in studentText: self.students.append(student.strip()) # try to load the semester map self.hasSemesters = False self.semesterMap = {} if os.path.exists(config.corpusPath + "semesters.csv"): handle = open(config.corpusPath + "semesters.csv", "r") reader = csv.reader(handle) for row in reader: self.semesterMap[row[0]] = row[1].strip() self.hasSemesters = True
def readFromPostprocessed(self, assignment, filename): path = self.config.corpusPath + '__algae__/postprocessed/' + assignment + '/' + filename if os.path.exists(path): return io.readFile(path) else: return None
def readFromAssignment(self, student, assignment, filename): path = self.config.corpusPath + student + '/' + assignment + '/' + filename if os.path.exists(path): return io.readFile(path) else: return None
def createCowMail(creatorMember, transaction, result, toMember, balanceBefore, balanceNow, lang): message = mail.EmailMessage( sender = DeBeeEmail, to = toMember.user.email(), subject = transactionNoticeSubject(toMember, lang)) global cowTxt if not (lang in cowTxt): cowTxt[lang] = readFile('texts/%s/cow.txt' % lang) global cowHtml if not (lang in cowHtml): cowHtml[lang] = readFile('texts/%s/cow.html' % lang) otherMembers = [] for member, balance in result.balanceChange.iteritems(): if member.user != toMember.user: otherMembers.append(member) others = '' i = 0 for member in otherMembers: if i == len(otherMembers) - 1: others += ' ' others += _('and', lang) others += ' ' elif i != 0: others += ', ' others += member.userNick i = i + 1 contributorsTxt = '' contributorsHtml = '<ul>' for col in transaction.collaborations: if col.money > 0: if col.member.user == toMember.user: mem = _('You', lang) else: mem = col.member.userNick contributorsTxt += ' * %s: $%s\n' % (mem, round(col.money, 2)) contributorsHtml += '<li>%s: $%s</li>' % (mem, round(col.money, 2)) contributorsHtml += '</ul>' decisionTxt = '' decisionHtml = '<ul>' for debt in result.debts: i = 0 msg = '' for singleDebt in debt.singleDebts: tuple = { 'from': debt.fromMember.userNick, 'to': singleDebt.toMember.userNick, 'amount': round(singleDebt.money, 2) } if i == 0: if debt.fromMember.user == toMember.user: msg += _('You owe %(to)s $%(amount)s', lang) % tuple elif singleDebt.toMember.user == toMember.user: msg += _('%(from)s owes you $%(amount)s', lang) % tuple else: msg += _('%(from)s owes %(to)s $%(amount)s', lang) % tuple elif i < len(debt.singleDebts) - 1: msg += ', ' if singleDebt.toMember.user == toMember.user: msg += _('you $%(amount)s', lang) % tuple else: msg += _('%(to)s $%(amount)s', lang) % tuple else: msg += ' ' msg += _('and', lang) msg += ' ' if singleDebt.toMember.user == toMember.user: msg += _('you $%(amount)s', lang) % tuple else: msg += _('%(to)s $%(amount)s', lang) % tuple i = i + 1 decisionTxt += ' * %s\n' % msg decisionHtml += '<li>%s</li>' % msg decisionHtml += '</ul>' message.body = cowTxt[lang] % (toMember.userNick, creatorMember.userNick, transaction.reason, others, round(result.total, 2), round(result.each, 2), contributorsTxt, decisionTxt, descriptionOfBalance(balanceBefore, True, lang), toMember.groupNick, descriptionOfBalance(balanceNow, False, lang)) message.html = cowHtml[lang] % (toMember.userNick, creatorMember.userNick, transaction.reason, others, round(result.total, 2), round(result.each, 2), contributorsHtml, decisionHtml, descriptionOfBalanceHtml(balanceBefore, True, lang), toMember.groupNick, descriptionOfBalanceHtml(balanceNow, False, lang)) return message
def readFromPreprocessed(self, student, assignment, filename): path = self.config.corpusPath + assignment + '/' + student + '/__algae__/' + filename if os.path.exists(path): return io.readFile(path) else: return None