Esempio n. 1
0
    def send_email(self):
        if not authorized(ValidAuthKitUser()):
            return { "failure" : Messages.invalidSession() }

        try:
            to_address = request.params['to_address']
            subject = request.params['subject']
            body = request.params['body']
        except:
            return { "failure" : Messages.invalidArguments() }

        if to_address == "" or subject == "" or body == "":
            return { "failure" : Messages.invalidArguments() }

        from email.MIMEText import MIMEText

        message = MIMEText(body.encode('utf-8'), 'plain', 'utf-8')
        message['Subject'] = subject
        message['From'] = config['from_address']
        message['To'] = to_address
        try:
            from fivecents.lib.mail import EmailSender
            ms = EmailSender(to_addresses = to_address)
            ms.send_mime(message)
        except Exception, e:
            return { "failure" : Messages.failedToSendEmail(exception=e) } 
Esempio n. 2
0
    def add(self):
        model = request.environ["sqlalchemy.model"]
        db = request.environ["sqlalchemy.session"]

        try:
            name = request.params['name']
        except:
            return { "failure": Messages.invalidArguments() }

        if name == "":
            return { "failure": Messages.invalidArguments() }

        try:
            user = db.query(model.AuthenticatedUser).filter_by(uid = h.authenticated_user().uid).one()
            balance = model.Balance(name = name,)
            user_balance = model.UserBalance(user_uid=h.authenticated_user().uid, writable=True)
            balance.users.append(user_balance)
            user.balances.append(user_balance)
            db.save(balance)

            # ensure we set writable to true (needed only with sqlite3)
            #ub = db.query(model.UserBalance).filter_by(user_uid=session[BaseController.AUTHENTICATED_USER], balance_uid=balance.uid).one()
            #ub.writable = True
            #db.save(ub)

            db.commit()
        except IntegrityError, e:
            return { "failure": Messages.primaryKeyViolation() }
Esempio n. 3
0
    def send_email(self):
        """
        Will send an e-mail with to a given address.
        Only authenticated users can use it.
        """

        if not authorized(ValidAuthKitUser()):
            return { "failure" : Messages.invalidSession() }

        to_address = request.params.get('to_address')
        subject = request.params.get('subject')
        body = request.params.get('body')

        if not to_address or not subject or not body:
            return { "failure" : Messages.invalidArguments() }

        from email.MIMEText import MIMEText
        message = MIMEText(body.encode('utf-8'), 'plain', 'utf-8')
        message['Subject'] = subject
        message['From'] = config['from_address']
        message['To'] = to_address
        try:
            self.emailSender().send_mime(to_address, config['from_address'], message)
        except Exception, e:
            return { "failure" : Messages.failedToSendEmail(exception=e) } 
Esempio n. 4
0
    def category(self):
        dbFacade = self.dbFacade()
        result = {}
            
        category = dbFacade.balances.categoryDao.find_by_name(request.params.get('category'))
        if category is None:
            return { "failure": Messages.invalidArguments() }

        for id in request.params.getall('id'):
            try:
                item = dbFacade.balances.changeDao.find_by_uid(id, options=[eagerload('balance')])
                if item is None:
                    result[id] = {
                        "deleted" : False,
                        "message": Messages.elementNotFound(key=id)
                    }
                    continue

                if not item.balance or not item.balance.can_modify_balance(h.authenticated_user().uid):
                    result[id] = {
                        "deleted" : False,
                        "message": Messages.permissionDenied()
                    }
                    continue

                item.category = category.name
                
                dbFacade.db.commit()
                result[id] = { "modified" : True }
            except Exception, e:
                result[id] = {
                    "deleted" : False,
                    "message" : Messages.failedToDelete(exception=e),
                }
Esempio n. 5
0
    def send_invitation(self):
        model = self.get_sa_model()
        db = self.get_sa_session()

        if not authorized(ValidAuthKitUser()):
            return { "failure" : Messages.invalidSession() }

        to_address = request.params.get('to_address')
        body = request.params.get('body')

        if not to_address or not body:
            return { "failure" : Messages.invalidArguments() }

        invitation = db.query(model.Invitation).filter_by(to_address = to_address).filter_by(sender_uid=h.authenticated_user().uid).first()
        if invitation:
            invitation.message = body
            invitation.sent = False
            invitation.sent_on = datetime.today()
        else:
            invitation = model.Invitation(
                sender_uid = h.authenticated_user().uid, 
                to_address = to_address,
                message = body
            )
            db.save(invitation)
        db.commit()
        return { "success" : Messages.messageWasSent() }
Esempio n. 6
0
    def edit_many(self):
        model = request.environ["sqlalchemy.model"]
        db = request.environ["sqlalchemy.session"]

        modified = []
        if not request.params.has_key("uids"):
            return {"failure": Messages.invalidArguments()}

        for uid in request.params.getall("uids"):
            try:
                if not Operations(db, model).can_modify_balance(h.authenticated_user().uid, uid):
                    continue

                balance = db.query(model.Balance).filter_by(uid=uid).one()
                name = request.params["name_%s" % (uid)]
                if name == "":
                    continue
                balance.name = name
                db.commit()
                modified.append({"uid": uid})
            except:
                # if it fails just skip it and go for next
                continue

        return modified
    def add(self):
        db = request.environ['sqlalchemy.session']
        model = request.environ['sqlalchemy.model']

        try:
            name = request.params['name']
        except:
            return { "failure": Messages.invalidArguments() }

        if name == "":
            return { "failure": Messages.invalidArguments() }

        try:
            ec = model.ExpenseCategory(name = name,)
            db.save(ec)
            db.commit()
        except IntegrityError, e:
            return { "failure": Messages.primaryKeyViolation() }
    def add(self):
        db = self.get_sa_session()
        model = self.get_sa_model()

        try:
            name = request.params['name']
        except:
            return { "failure": Messages.invalidArguments() }

        if name == "":
            return { "failure": Messages.invalidArguments() }

        try:
            ec = model.ChangeCategory(name = name,)
            db.save(ec)
            db.commit()
        except IntegrityError, e:
            return { "failure": Messages.primaryKeyViolation() }
Esempio n. 9
0
    def send_feedback(self):
        try:
            from_address = request.params['from_address']
            subject = _("Feedback about %s " % h.site_name())
            body = request.params['body']
        except:
            return { "failure" : Messages.invalidArguments() }

        if from_address == "" or subject == "" or body == "":
            return { "failure" : Messages.invalidArguments() }

        from email.MIMEText import MIMEText
        message = MIMEText(body.encode('utf-8'), 'plain', 'utf-8') 
        message['Subject'] = subject
        message['From'] = from_address
        message['To'] = config['email_to']
        try:
            from fivecents.lib.mail import EmailSender
            ms = EmailSender(to_addresses = message['To'])
            ms.send_mime(message)
        except Exception, e:
            return { "failure" : Messages.failedToSendEmail(exception=e) } 
Esempio n. 10
0
    def send_invitation(self):
        model = request.environ["sqlalchemy.model"]
        db = request.environ["sqlalchemy.session"]

        if not authorized(ValidAuthKitUser()):
            return { "failure" : Messages.invalidSession() }

        try:
            to_address = request.params['to_address']
            subject = _("You have been invited to %s " % h.site_name())
            body = request.params['body']
        except:
            return { "failure" : Messages.invalidArguments() }

        if to_address == "" or subject == "" or body == "":
            return { "failure" : Messages.invalidArguments() }

        invitation = model.Invitation(
            sender_uid = h.authenticated_user().uid, 
            to_address = to_address,
        )

        db.save(invitation)
        db.commit()

        c.invitation_link = h.site_url() + h.url_for(controller='signup', action='invitation', id=invitation.token)

        from email.MIMEText import MIMEText
        body = body + render_jinja('messages/invitation_footer.jinja')
        message = MIMEText(body.encode('utf-8'), 'plain', 'utf-8') 
        message['Subject'] = subject
        message['From'] = config['from_address']
        message['To'] = to_address
        try:
            from fivecents.lib.mail import EmailSender
            ms = EmailSender(to_addresses = to_address)
            ms.send_mime(message)
        except Exception, e:
            return { "failure" : Messages.failedToSendEmail(exception=e) } 
Esempio n. 11
0
    def add(self, balance_uid):
        model = request.environ['sqlalchemy.model']
        db = request.environ['sqlalchemy.session']

        balance = db.query(model.Balance).filter_by(uid = balance_uid).first()
        if not balance or not balance.can_modify_balance(h.authenticated_user().uid):
            return { "failure": Messages.permissionDenied() }

        try:
            with localcontext() as ctx:
                ctx.prec = 2
                try:
                    amount = h.parse_decimal(request.params['amount'])
                except:
                    log.error("Invalid number: %s" % request.params.get('amount'), exc_info=1)
                    return { "failure": Messages.invalidCurrencyFormat() }
            expense_date = h.parse_date(request.params['occurred_on']) 
            income_category_uid = None
            expense_category_uid = None

            if (int(request.params['is_income']) >= 0):
                    income_category_uid = int(request.params['income_category_uid'])
                    is_income = True
            else:
                    expense_category_uid = int(request.params['expense_category_uid'])
                    is_income = False
        except:
            log.error("Failed to parse arguments %s" % str(request.params), exc_info=1)
            return { "failure": Messages.invalidArguments() }

        tags = request.params.get('tags', '')
        description = request.params.get('description', '')

        bc = model.BalanceChange(
            amount = amount, 
            description = description,
            user_uid = h.authenticated_user().uid, 
            expense_category_uid = expense_category_uid,
            occurred_on = expense_date,
            is_income = is_income,
            income_category_uid = income_category_uid
        )

        balance.changes.append(bc)
        db.flush()
        ops = Operations(db, model)
        ops.change_tags_from_string(bc, tags)
        ops.save_balance_change(bc)

        return { "id" : bc.uid }
Esempio n. 12
0
    def add(self, balance_uid):
        model = request.environ['sqlalchemy.model']
        db = request.environ['sqlalchemy.session']

        if not Operations(db, model).can_modify_balance(h.authenticated_user().uid, balance_uid):
            return { "failure": Messages.permissionDenied() }

        try:
            with localcontext() as ctx:
                ctx.prec = 2
            	try:
                	amount = h.parse_decimal(request.params['amount'])
            	except NumberFormatError:
                	return { "failure": Messages.invalidCurrencyFormat() }
            expense_date = parser.parse(request.params['occurred_on']) 
            income_category_uid = None
            expense_category_uid = None

            if (int(request.params['is_income']) >= 0):
                    income_category_uid = int(request.params['income_category_uid'])
                    is_income = True
            else:
                    expense_category_uid = int(request.params['expense_category_uid'])
                    is_income = False
        except:
            return { "failure": Messages.invalidArguments() }

        tags = request.params.get('tags', '')
    
        try:
            description = request.params['description']
        except:
            description = ""

        try:
            bc = model.BalanceChange(
                amount = amount, 
                description = description, 
                balance_uid = balance_uid, 
                user_uid = h.authenticated_user().uid, 
                expense_category_uid = expense_category_uid,
                occurred_on = expense_date,
                is_income = is_income,
                income_category_uid = income_category_uid
            )
            ops = Operations(db, model)
            ops.change_tags_from_string(bc, tags)
            ops.save_balance_change(bc)
        except IntegrityError, e:
            return { "failure": Messages.primaryKeyViolation() }
Esempio n. 13
0
    def add(self):
        model = request.environ["sqlalchemy.model"]
        db = request.environ["sqlalchemy.session"]

        name = request.params.get('name')
        if not name:
            return { "failure": Messages.invalidArguments() }

        try:
            ec = model.IncomeCategory(name = name,)
            db.save(ec)
            db.commit()
        except IntegrityError, e:
            return { "failure": Messages.primaryKeyViolation() }
Esempio n. 14
0
    def _edit_stock(self, stock):
        try:
            stock.ticker = request.params['ticker'][0:50].upper()
        except:
            return { "failure": Messages.invalidArguments() }

        try:
            stock.count = int(request.params['count'])
        except:
            return { "failure": Messages.invalidArguments() }

        try:
            stock.buy = asbool(request.params['buy'])
        except:
            return { "failure": Messages.invalidArguments() }
        
        try: 
            with localcontext() as ctx: 
                ctx.prec = 2 
                stock.price = h.parse_decimal(request.params['price']) 
        except: 
            log.error("Invalid number: %s" % request.params.get('amount'), exc_info=1) 
            return { "failure": Messages.invalidCurrencyFormat() }

        try:
            stock.occurred_on = h.parse_date(request.params['occurred_on'])
        except:
            return { "failure": Messages.invalidDate() }

        if stock.user is None:
            stock.user = h.authenticated_user()

        self.dbFacade().stocks.changeDao.save(stock)
        self.dbFacade().db.commit()

        return { "id" : stock.uid }
Esempio n. 15
0
    def add(self, balance_uid):
        dbFacade = DbFacade(request.environ['sqlalchemy.session'], request.environ['sqlalchemy.model'])

        balance = dbFacade.balances.balanceDao.find_by_uid(balance_uid)
        if not balance or not balance.can_modify_balance(h.authenticated_user().uid):
            return { "failure": Messages.permissionDenied() }

        try:
            with localcontext() as ctx:
                ctx.prec = 2
                try:
                    amount = h.parse_decimal(request.params['amount'])
                except:
                    log.error("Invalid number: %s" % request.params.get('amount'), exc_info=1)
                    return { "failure": Messages.invalidCurrencyFormat() }
            expense_date = h.parse_date(request.params['occurred_on']) 
            income_category_uid = None
            expense_category_uid = None

            if (int(request.params['is_income']) >= 0):
                    income_category_uid = int(request.params['income_category_uid'])
                    is_income = True
            else:
                    expense_category_uid = int(request.params['expense_category_uid'])
                    is_income = False
        except:
            log.error("Failed to parse arguments %s" % str(request.params), exc_info=1)
            return { "failure": Messages.invalidArguments() }

        tags = request.params.get('tags', '')
        description = request.params.get('description', '')

        bc = dbFacade.model.BalanceChange(
            amount = amount, 
            description = description,
            user_uid = h.authenticated_user().uid, 
            expense_category_uid = expense_category_uid,
            occurred_on = expense_date,
            is_income = is_income,
            income_category_uid = income_category_uid
        )
        
        bc.tags = dbFacade.balances.find_or_create_tags(balance, 
            dbFacade.balances.elements_from_string(tags))

        dbFacade.balances.add_balance_change(balance, bc)
        dbFacade.db.commit()
        return { "id" : bc.uid }
Esempio n. 16
0
    def send_feedback(self):
        from_address = request.params.get('from_address')
        subject = _("Feedback about %s ") % h.site_name()
        body = request.params.get('body')

        if not from_address or not subject or not body:
            return { "failure" : Messages.invalidArguments() }

        from email.MIMEText import MIMEText
        message = MIMEText(body.encode('utf-8'), 'plain', 'utf-8') 
        message['Subject'] = subject
        message['From'] = from_address
        message['To'] = config['email_to']
        try:
            self.emailSender().send_mime(config['email_to'], from_address, message)
        except Exception, e:
            return { "failure" : Messages.failedToSendEmail(exception=e) } 
Esempio n. 17
0
    def add(self):
        model = request.environ["sqlalchemy.model"]
        db = request.environ["sqlalchemy.session"]

        name = request.params.get("name")
        if not name:
            return {"failure": Messages.invalidArguments()}

        try:
            user = db.query(model.AuthenticatedUser).filter_by(uid=h.authenticated_user().uid).one()
            balance = model.Balance(name=name)
            user_balance = model.UserBalance(user_uid=h.authenticated_user().uid, writable=True)
            balance.users.append(user_balance)
            user.balances.append(user_balance)
            db.save(balance)
            db.commit()
        except IntegrityError, e:
            return {"failure": Messages.primaryKeyViolation()}
Esempio n. 18
0
    def _edit_balance(self, balance):
        if balance.uid is not None:
            if not balance.can_modify_balance(h.authenticated_user().uid):
                return { "failure": Messages.permissionDenied() }

        try:
            balance.name = request.params['name'][0:25]
        except:
            return { "failure": Messages.invalidArguments() }

        if len(balance.users.all()) == 0:
            user_balance = self.dbFacade().model.UserBalance(user_uid=h.authenticated_user().uid, writable=True)
            balance.users.append(user_balance)
            h.authenticated_user().balances.append(user_balance)

        self.dbFacade().balances.balanceDao.save(balance)
        self.dbFacade().db.commit()

        return { "id" : balance.uid }
Esempio n. 19
0
    def edit_many(self):
        model = request.environ["sqlalchemy.model"]
        db = request.environ["sqlalchemy.session"]

        modified = []
        if not request.params.has_key('uids'):
            return { "failure": Messages.invalidArguments() }

        for uid in request.params.getall("uids"):
            try:
                ec = db.query(model.IncomeCategory).filter_by(uid=uid).one()
                name = request.params['name_%s' % (uid)]
                if name == "":
                    continue
                ec.name = name
                db.commit()
                modified.append({"uid" : uid})
            except:
                # if it fails just skip it and go for next
                continue

        return modified
Esempio n. 20
0
    def edit_many(self):
        db = self.get_sa_session()
        model = self.get_sa_model()

        modified = []
        if not request.params.has_key('uids'):
            return { "failure": Messages.invalidArguments() }

        for uid in request.params.getall("uids"):
            try:
                ec = db.query(model.ChangeCategory).filter_by(uid=uid).one()
                name = request.params.get('name_%s' % (uid))
                if not name:
                    continue
                ec.name = name
                db.commit()
                modified.append({"uid" : uid})
            except:
                # if it fails just skip it and go for next
                continue

        return modified
Esempio n. 21
0
    def list_months(self, balance_uid):
        model = request.environ['sqlalchemy.model']
        db = request.environ['sqlalchemy.session']

        try:
            user_uid = h.authenticated_user().uid
        except:
            return { "failure": Messages.invalidArguments() }
        if not Operations(db, model).can_see_balance(user_uid, balance_uid):
            return { "failure": Messages.permissionDenied() }

        months = db.execute(
            select(
                [extract('year', model.BalanceChange.c.occurred_on).label('year'), extract('month', model.BalanceChange.c.occurred_on).label('month')], 
                model.BalanceChange.c.balance_uid==balance_uid,
                from_obj=[model.balance_changes_table],
                group_by=[extract('year', model.BalanceChange.c.occurred_on), extract('month', model.BalanceChange.c.occurred_on)])).fetchall()

        total = len(months)
        try:
            page_nr = request.params['page_nr']
        except:
            page_nr = 1

        try:
            items_per_page = int(request.params['items_per_page'])
        except:
            items_per_page = 15
        
        subset = Page(months, item_count=total, current_page=page_nr, items_per_page=items_per_page)
        return { 
            "totalItems" : total,
            "itemsFound" : len(subset),
            "items" : [{ 
                "year" : int(item.year), 
                "month": int(item.month) } for item in subset ]
        }
Esempio n. 22
0
    def _edit_category(self, category_tc, is_new = True):
        dbFacade = self.dbFacade();
        new_category_name = request.params.get('name');
        parent_name = request.params.get('parent');

        if dbFacade.balances.categoryDao.find_by_name(new_category_name, h.authenticated_user().uid):
            return { "failure" : Messages.categoryAlreadyExists(name=new_category_name) }
        parent_tc = dbFacade.balances.categoryDao.find_by_name(parent_name, h.authenticated_user().uid)

        if not parent_tc or parent_tc.name == '' or not new_category_name:
            return { "failure" : Messages.invalidArguments() }
        if not hasattr(parent_tc, 'subcats') or not parent_tc.subcats:            
            return { "failure" : Messages.wrongParentCategory(name=parent_name) }

        category_tc.name = new_category_name
        category_tc.parent = parent_tc.key
        category_tc.user_uid = h.authenticated_user().uid
        dbFacade.balances.categoryDao.save(category_tc)

        if not is_new:
            self._change_changes_category(request.params.get('old_name'), new_category_name)

        dbFacade.db.commit()
        return { "id" : category_tc.uid }     
Esempio n. 23
0
    def _edit_change(self, to_bc):
        dbFacade = self.dbFacade()
    
        if to_bc.uid is not None:
            if not to_bc.balance or not to_bc.balance.can_modify_balance(h.authenticated_user().uid):
                return { "failure": Messages.permissionDenied() }

            # If it's a transfer check if user can modify the other balance
            if to_bc.transfer:
                old_from_balance = dbFacade.balances.balanceDao.find_by_uid(to_bc.transfer.balance_uid)
                if not old_from_balance or not old_from_balance.can_modify_balance(h.authenticated_user().uid):
                    return { "failure": Messages.permissionDenied() }

        to_balance_uid = request.params.get('to_balance_uid')
        to_balance = dbFacade.balances.balanceDao.find_by_uid(to_balance_uid)
        if not to_balance or not to_balance.can_modify_balance(h.authenticated_user().uid):
            return { "failure": Messages.permissionDenied() }

        try:
             with localcontext() as ctx:
                ctx.prec = 2
                to_bc.amount = h.parse_decimal(request.params['amount'])
        except:
            log.error("Invalid number: %s" % request.params.get('amount'), exc_info=1)
            return { "failure": Messages.invalidCurrencyFormat() }
    
        try:
            to_bc.occurred_on = h.parse_date(request.params['occurred_on']) 
        except:
            return { "failure": Messages.invalidDate() }
            
        try:
            to_bc.change_category_uid = int(request.params['change_category_uid'])
        except:
            log.error("Failed to parse arguments %s" % str(request.params), exc_info=1)
            return { "failure": Messages.invalidArguments() }

        to_bc.balance = to_balance
        to_bc.tags = [dbFacade.model.ChangeTag(tag=tag) for tag in dbFacade.balances.elements_from_string(request.params.get('tags', ''))]
        to_bc.description = request.params.get('description', '')
        to_bc.user_uid = h.authenticated_user().uid

        from_balance_uid = request.params.get('from_balance_uid')
        if from_balance_uid is not None:
            if from_balance_uid == to_balance_uid:
                return { "failure": Messages.pleaseSelectDifferentAccounts() }

            from_balance = dbFacade.balances.balanceDao.find_by_uid(from_balance_uid)
            if not from_balance or not from_balance.can_modify_balance(h.authenticated_user().uid):
                return { "failure": Messages.permissionDenied() }

            from_bc = to_bc.transfer and to_bc.transfer or dbFacade.model.BalanceChange()
            to_bc.amount = abs(to_bc.amount)
            from_bc.amount = -to_bc.amount
            from_bc.occurred_on = to_bc.occurred_on
            from_bc.change_category_uid = to_bc.change_category_uid
            from_bc.balance = from_balance
            from_bc.tags = [dbFacade.model.ChangeTag(tag=tag) for tag in dbFacade.balances.elements_from_string(request.params.get('tags', ''))] 
            from_bc.description = to_bc.description
            from_bc.user_uid = h.authenticated_user().uid

            from_bc.transfer = to_bc
            to_bc.transfer = from_bc
        elif to_bc.transfer is not None:
            from_bc = to_bc.transfer
            from_bc.transfer = None
            to_bc.transfer = None
            dbFacade.db.flush()
            dbFacade.db.delete(from_bc)
            
        dbFacade.balances.changeDao.save(to_bc)
        dbFacade.db.commit()
        return { "id" : to_bc.uid }