def post(self): if not userIsLoggedIn(self): return user = users.get_current_user() lang = getLanguage(self, user) groupKey = self.request.get('group').strip() if groupKey == "": error = _('Group is required', lang) alertMessage(self,error) return group = Group.get(groupKey) memberships = Membership.gql("WHERE group = :1 AND user = :2", group, user) if memberships.count() <> 1: error = _('You don\'t belong to this group.', lang) alertMessage(self,error) return membership = memberships.get() if not abs(membership.balance) <= 1e-07: error = _('You cannot leave this group, your balance must be zero.', lang) alertMessage(self,error) return membership.delete() if Membership.gql("WHERE group = :1", group).count() == 0: group.delete() msg = _('You have been succesfully unsubscribed from the group %s!', lang) % escape(group.name) location = '/?msg=' + msg redirectPage(self,location)
def post(self): if not userIsLoggedIn(self): return rejectPath = UrlBuilder(self.request).buildUrl('/reject') user = users.get_current_user() lang = getLanguage(self, user) group = Group.get(self.request.get("group")) creatorMember = Membership.gql("WHERE group = :1 AND user = :2", group, user)[0] if not creatorMember: return command = self.request.get("cow") members = group.memberships parser = CowParser() parser.lang = lang transaction = parser.parse(members, command) if transaction.error: alertMessage(self, transaction.error) return result = transaction.getResult() # Update balance and send mails for member, balance in result.balanceChange.iteritems(): balanceBefore = member.balance balanceNow = member.balance + balance # Balance member.balance += balance member.put() # Send mail, but not to the creator of this mail if member.user != creatorMember.user: message = createCowMail(creatorMember, transaction, result, member, balanceBefore, balanceNow, lang) sendEmail(message) # Create transactions for debt in result.debts: for singleDebt in debt.singleDebts: tr = Transaction( group = group, creatorMember = creatorMember, fromMember = debt.fromMember, toMember = singleDebt.toMember, type = 'debt', amount = singleDebt.money, reason = transaction.reason, isRejected = False ) tr.put() location = '/group?group=%s&msg=%s' % (group.key(), _('Debts saved!', lang)) redirectPage(self,location)
def createGroupAndInsertMember(self, gname): user = users.get_current_user() count = Membership.gql("WHERE user = :1 AND alias = :2", user, gname).count() if count > 0: return None group = Group(name=gname) group.put() self.insertUserInGroup(group) return group
def post(self): if not userIsLoggedIn(self): return user = users.get_current_user() lang = getLanguage(self, user) userMembership = Membership.get(self.request.get('userMembership')) # Verificar que la membership que se paso sea efectivamente del usuario if not self.isMember(userMembership): return newGroupNick = self.request.get('groupNick').strip() newUserNick = self.request.get('userNick').strip() # Verificar que el nombre de grupo no sea vacio if newGroupNick == "": error = _('The name by which you want to see this group is required.', lang) alertMessage(self,error) return # Verificar que no exista un alias del usuario con el mismo nombre if self.isGroupNickTaken(newGroupNick, userMembership.group): error = _('You already have a Group with the selected name, please select another name.', lang) alertMessage(self,error) return # Verificar que el nickname no sea vacio if newUserNick == "": error = _('The name by which you want others to see you in this group is required.', lang) alertMessage(self,error) return # Verificar que el nickname no este tomado for other in Membership.gql("WHERE group = :1 AND user != :2", userMembership.group, userMembership.user): if other.userNick == newUserNick: error = _('The name by which you want others to see you in this group is already used by another member.', lang) alertMessage(self,error) return userMembership.alias = newGroupNick userMembership.nickname = newUserNick userMembership.put() location = '/group?group=%s&msg=%s' % (userMembership.group.key(), _('Properties changed!', lang)) redirectPage(self,location)
def post(self): if not userIsLoggedIn(self): return user = users.get_current_user(); lang = getLanguage(self, user) group = Group.get(self.request.get("group")) creatorMember = Membership.gql("WHERE group = :1 AND user = :2", group, user)[0] if not creatorMember: return command = self.request.get("command") members = group.memberships parser = OrderParser() parser.lang = lang transaction = parser.parse(members, command) if transaction.error: alertMessage(self, transaction.error) return elems = {} total = 0.0 for debt in transaction.debts: total += debt.money razon = debt.reason comidas = razon.split(',') for comida in comidas: comida = comida.strip() [cantidad, comida2] = quantity(comida) elems[comida2] = elems.get(comida2, 0) + cantidad result = '' for comida, cantidad in elems.items(): result += ' - %s %s\\n' % (cantidad, comida) result += '\\n'; result += _('Total', lang) result += ': $%s'% total; alertMessage(self, result)
def post(self): if not userIsLoggedIn(self): return rejectPath = UrlBuilder(self.request).buildUrl('/reject') user = users.get_current_user() lang = getLanguage(self, user) group = Group.get(self.request.get("group")) creatorMember = Membership.gql("WHERE group = :1 AND user = :2", group, user)[0] if not creatorMember: return command = self.request.get("command") members = group.memberships parser = OrderParser() parser.lang = lang transaction = parser.parse(members, command) if transaction.error: alertMessage(self, transaction.error) return payersBalanceBefore = transaction.payer.balance for debt in transaction.debts: debtor = debt.member payer = transaction.payer debtorLang = getLanguage(self, debtor.user) if debtor.user.email().lower() == payer.user.email().lower(): continue debtorsBalanceBefore = debtor.balance # Adjust balance debtor.balance -= debt.money debtor.put() payer.balance += debt.money debtorsBalanceNow = debtor.balance # Create transaction tr = Transaction( group = group, creatorMember = creatorMember, fromMember = debtor, toMember = payer, type = 'debt', amount = debt.money, reason = debt.reason, isRejected = False ) tr.put() # If the one that created this transaction is the one that owes, # don't sent a mail to him/her if creatorMember.user == debtor.user: continue # Build the reject url rejectUrl = UrlBuilder(self.request).buildUrl('/reject') rejectUrl += "?key=%s&h=%s" % (str(tr.key()), tr.hash) # Try send email to the debtor if creatorMember.user == transaction.payer.user: message = createActionMail(payer, debtor, debt.money, debt.reason, debtorsBalanceBefore, debtorsBalanceNow, rejectUrl, youOwedSomeone(debtorLang), debtorLang) else: message = createThirdPartyActionMail(creatorMember, payer, debtor, debt.money, debt.reason, debtorsBalanceBefore, debtorsBalanceNow, rejectUrl, creatorSaysYouOwedSomeone(debtorLang), debtorLang) sendEmail(message) transaction.payer.put() payersBalanceNow = transaction.payer.balance # Now try send email to the payer with a summary if not creatorMember.user == transaction.payer.user: payerLang = getLanguage(self, transaction.payer.user) message = createBulkMail(transaction, creatorMember, payersBalanceBefore, payersBalanceNow, payerLang) sendEmail(message) location = '/group?group=%s&msg=%s' % (group.key(), _('Debts saved!', lang)) redirectPage(self,location)
def post(self): if not userIsLoggedIn(self): return user = users.get_current_user(); lang = getLanguage(self, user) group = Group.get(self.request.get("group")) creatorMember = Membership.gql("WHERE group = :1 AND user = :2", group, user)[0] if not creatorMember: return command = self.request.get("cow") members = group.memberships parser = CowParser() parser.lang = lang transaction = parser.parse(members, command) if transaction.error: alertMessage(self, transaction.error) return result = transaction.getResult() msg = '' msg += _('Total', lang) msg += ': $%s\\n'% result.total; msg += _('Each', lang) msg += ': $%s\\n\\n'% round(result.each, 2); 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 == creatorMember.user: msg += _('You owe %(to)s $%(amount)s', lang) % tuple elif singleDebt.toMember.user == creatorMember.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 == creatorMember.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 == creatorMember.user: msg += _('you $%(amount)s', lang) % tuple else: msg += _('%(to)s $%(amount)s', lang) % tuple i = i + 1 msg += '\\n' alertMessage(self, msg)
def membershipsOfUser(user): memberships = Membership.gql("WHERE user = :1", user) return memberships.fetch(10000)
def get(self): user = users.get_current_user() lang = getLanguage(self, user) groupKey = self.request.get("group") try: group = Group.get(groupKey) email = self.request.get("user") invitation = GroupInvitation(group, email, UrlBuilder(self.request)) # Verificar que la invitacion es valida (coinciden los hashes) isValidInvitation = invitation.makeHash() == self.request.get("hash") # Verificar que el usuario logueado coincide con el mail de la invitacion isValidUser = user.email().lower() == email.lower() except: group = None isValidInvitation = False isValidUser = False if not isValidInvitation or not isValidUser: template_values = { 'isValidInvitation': isValidInvitation, 'isValidUser': isValidUser, 'group': group, 'username': user.nickname(), 'signout_url': users.create_logout_url("/"), # i18n 'ThisInvitationIsNotForYou': _('This invitation is not for you.', lang), 'TheInvitationIsInvalid': _('The invitation is invalid.', lang) } addMasterKeys(template_values, lang) path = os.path.join(os.path.dirname(__file__), 'acceptInvitationError.html') self.response.out.write(template.render(path, template_values)) return # Verificar que el usuario no sea miembro del grupo isMember = Membership.gql("WHERE user = :1 AND group = :2", user, group).count() > 0 # If he's already a member, don't bother showing her that. # Just redirect to the group page with an appropriate message. if not isMember: msg = _('You are now a member of %s group', lang) % group.name # Join the user into the group. If later she finds out she has two # groups with the same name, she'll already know she can change the name # because she already belonged to another group... so she must know the site Membership( user = user, group = group, balance = 0.0, alias = group.name ).put() else: msg = _('You are already a member of this group', lang) self.redirect('/group?group=%s&msg=%s' % (group.key(), msg))
def isGroupNickTaken(self, alias, group): user = users.get_current_user() return Membership.gql("WHERE user = :1 AND alias = :2 AND group != :3", user, alias, group).count() > 0