def account(request, key): template = loader.get_template('page_account_details.html') account = get_account(key) splits = filters.TransactionSplitFilter(account) all_accounts = Account.get_all() all_accounts.sort(key=lambda a: a.path) all_accounts_dict = {} for a in all_accounts: all_accounts_dict[a.guid] = { 'path': a.path, 'name': a.name } choices = forms.AccountChoices(account) filter_form = forms.FilterForm(choices, request.GET) if filter_form.is_valid(): splits.filter_splits(filter_form.cleaned_data) splits.order_filtered_splits() modify_form_data = request.GET.copy() modify_form_data['save_rule'] = True modify_form = forms.ModifyForm(choices, modify_form_data, auto_id="modify_id_%s") try: page_num = int(request.GET.get('page')) except: page_num = 1 pages = Paginator(splits.filtered_splits, settings.NUM_TRANSACTIONS_PER_PAGE) try: page = pages.page(page_num) except PageNotAnInteger: page = pages.page(1) except EmptyPage: page = pages.page(pages.num_pages) Transaction.cache_from_splits(page.object_list) c = RequestContext(request, { 'any_filters_applied': splits.any_filters_applied, 'one_opposing_account_filter_applied': splits.one_opposing_account_filter_applied, 'regex_chars_js': json.dumps(filters.TransactionSplitFilter.REGEX_CHARS), 'all_accounts': all_accounts, 'accounts_js': json.dumps(all_accounts_dict), 'current_account_js': json.dumps(account.guid), 'num_transactions_js': json.dumps(page.paginator.count), 'api_functions_js': json.dumps(api.function_urls.urls_dict), 'account': account, 'page': page, 'filter_form': filter_form, 'modify_form': modify_form, }) return HttpResponse(template.render(c))
def __init__(self, accounts): self.accounts = accounts self.splits = reduce(operator.or_, (a.split_set.select_related(depth=3) for a in accounts)) if len(self.accounts) > 1: Transaction.cache_from_splits(self.splits) exclude_split_guids = [] account_guids = [a.guid for a in self.accounts] for s in self.splits: if any(os != s and os.account in self.accounts for os in s.transaction.splits): exclude_split_guids.append(s.guid) self.splits = self.splits.exclude(guid__in=exclude_split_guids) self.filtered_splits = self.splits self.any_filters_applied = False self.one_opposing_account_filter_applied = False
def get_transactions(request): # This is not structured like the other account views (with a `key` parameter # in the URL) because the code above that builds _urls_dict cannot handle # views with parameters. key = request.GET.get('accounts') accounts = misc_functions.get_accounts_by_webapp_key(key) splits = filters.TransactionSplitFilter(accounts) choices = forms.AccountChoices(accounts) filter_form = forms.FilterForm(choices, request.GET) if filter_form.is_valid(): splits.filter_splits(filter_form.cleaned_data) splits.order_filtered_splits() Transaction.cache_from_splits(splits.filtered_splits) data_splits = [] data_transactions = [] transactions_seen = {} for s in splits.filtered_splits: # Determine the best memo to show, if any # TODO logic duplicated with money_views.views.account_csv memo = '' if s.memo_is_id_or_blank: for memo_split in s.opposing_split_set: if not memo_split.memo_is_id_or_blank: memo = memo_split.memo break else: memo = s.memo tx = s.transaction if tx.guid not in transactions_seen: data_tx_splits = [] for ts in tx.split_set.all(): data_tx_splits.append({ 'guid': ts.guid, 'account': { 'friendly_name': ts.account.description_or_name, 'path': ts.account.path, 'guid': ts.account.guid }, 'memo': ts.memo, 'amount': str(ts.amount) }) data_transactions.append({ 'guid': tx.guid, 'description': tx.description, 'post_date': misc_functions.date_to_timestamp(tx.post_date), 'splits': data_tx_splits }) transactions_seen[tx.guid] = True opposing_account = s.opposing_account data_splits.append({ 'account': { 'friendly_name': s.account.description_or_name, 'path': s.account.path, 'guid': s.account.guid }, 'opposing_account': { 'friendly_name': opposing_account.description_or_name, 'path': opposing_account.path, 'guid': opposing_account.guid }, 'tx_guid': tx.guid, 'description': tx.description, 'memo': memo, 'post_date': misc_functions.date_to_timestamp(tx.post_date), 'amount': str(s.amount) }) return {'splits': data_splits, 'transactions': data_transactions}
def account(request, key): template = loader.get_template('page_account_details.html') accounts = misc_functions.get_accounts_by_webapp_key(key) splits = filters.TransactionSplitFilter(accounts) all_accounts = Account.get_all() all_accounts.sort(key=lambda a: a.path) all_accounts_dict = {} for a in all_accounts: all_accounts_dict[a.guid] = { 'path': a.path, 'name': a.name } choices = forms.AccountChoices(accounts) filter_form = forms.FilterForm(choices, request.GET) if filter_form.is_valid(): splits.filter_splits(filter_form.cleaned_data) splits.order_filtered_splits() modify_form_data = request.GET.copy() modify_form_data['save_rule'] = True modify_form = forms.ModifyForm(choices, modify_form_data, auto_id="modify_id_%s") try: can_add_transactions = settings.ENABLE_ADD_TRANSACTIONS except AttributeError: can_add_transactions = False can_add_transactions = (can_add_transactions and len(accounts) == 1) if can_add_transactions: new_transaction_form = forms.NewTransactionForm(choices, auto_id='id_new_trans_%s') else: new_transaction_form = None try: page_num = int(request.GET.get('page')) except: page_num = 1 pages = Paginator(splits.filtered_splits, settings.NUM_TRANSACTIONS_PER_PAGE) try: page = pages.page(page_num) except PageNotAnInteger: page = pages.page(1) except EmptyPage: page = pages.page(pages.num_pages) Transaction.cache_from_splits(page.object_list) current_accounts_key = misc_functions.accounts_webapp_key(accounts) c = RequestContext(request, { 'any_filters_applied': splits.any_filters_applied, 'one_opposing_account_filter_applied': splits.one_opposing_account_filter_applied, 'query_params_js': json.dumps(request.GET), 'regex_chars_js': json.dumps(filters.TransactionSplitFilter.REGEX_CHARS), 'all_accounts': all_accounts, 'accounts_js': json.dumps(all_accounts_dict), 'current_accounts_js': json.dumps([a.guid for a in accounts]), 'num_transactions_js': json.dumps(page.paginator.count), 'api_functions_js': json.dumps(api.function_urls.urls_dict), 'accounts': accounts, 'current_accounts_key': current_accounts_key, 'current_accounts_key_js': json.dumps(current_accounts_key), 'can_add_transactions': can_add_transactions, 'account': accounts[0], 'page': page, 'filter_form': filter_form, 'modify_form': modify_form, 'new_transaction_form': new_transaction_form, 'total_balance': sum(a.balance for a in accounts), }) return HttpResponse(template.render(c))
def get_transactions(request): # This is not structured like the other account views (with a `key` parameter # in the URL) because the code above that builds _urls_dict cannot handle # views with parameters. key = request.GET.get('accounts') accounts = misc_functions.get_accounts_by_webapp_key(key) splits = filters.TransactionSplitFilter(accounts) choices = forms.AccountChoices(accounts) filter_form = forms.FilterForm(choices, request.GET) if filter_form.is_valid(): splits.filter_splits(filter_form.cleaned_data) splits.order_filtered_splits() Transaction.cache_from_splits(splits.filtered_splits) data_splits = [] data_transactions = [] transactions_seen = {} for s in splits.filtered_splits: # Determine the best memo to show, if any # TODO logic duplicated with money_views.views.account_csv memo = '' if s.memo_is_id_or_blank: for memo_split in s.opposing_split_set: if not memo_split.memo_is_id_or_blank: memo = memo_split.memo break else: memo = s.memo tx = s.transaction if tx.guid not in transactions_seen: data_tx_splits = [] for ts in tx.split_set.all(): data_tx_splits.append({ 'guid': ts.guid, 'account': { 'friendly_name': ts.account.description_or_name, 'path': ts.account.path, 'guid': ts.account.guid }, 'memo': ts.memo, 'amount': str(ts.amount) }) data_transactions.append({ 'guid': tx.guid, 'description': tx.description, 'post_date': misc_functions.date_to_timestamp(tx.post_date), 'splits': data_tx_splits }) transactions_seen[tx.guid] = True opposing_account = s.opposing_account data_splits.append({ 'account': { 'friendly_name': s.account.description_or_name, 'path': s.account.path, 'guid': s.account.guid }, 'opposing_account': { 'friendly_name': opposing_account.description_or_name, 'path': opposing_account.path, 'guid': opposing_account.guid }, 'tx_guid': tx.guid, 'description': tx.description, 'memo': memo, 'post_date': misc_functions.date_to_timestamp(tx.post_date), 'amount': str(s.amount) }) return { 'splits': data_splits, 'transactions': data_transactions }
def process_request(self, request): Account.clear_caches() Transaction.clear_caches() return None