Skip to content

Commit

Permalink
BE: stocks pnl and transactions upload
Browse files Browse the repository at this point in the history
  • Loading branch information
andreipradan committed Nov 12, 2024
1 parent 8bc0509 commit 10edf77
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 139 deletions.
1 change: 1 addition & 0 deletions deploy/show-logs.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
journalctl --follow -o cat -u backend.service \
-u bot.service \
-u quiz.service \
-u huey.service \
-u nginx \
-u ngrok.service \
Expand Down
16 changes: 10 additions & 6 deletions src/mainframe/clients/devices.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,6 @@ def run(self):
for device in devices
if device.mac not in list(map(attrgetter("mac"), existing_devices))
]
self.logger.info(
"Got %d devices%s",
len(devices),
f" ({len(new_devices)} new ones)" if new_devices else "",
extra={"new_devices": new_devices},
)

active_macs = list(map(attrgetter("mac"), devices))
went_online = [
Expand All @@ -80,6 +74,16 @@ def run(self):
for device in existing_devices
if device.is_active and device.mac not in active_macs
]
self.logger.info(
"Got %d devices%s",
len(devices),
f" ({len(new_devices)} new ones)" if new_devices else "",
extra={
"new_devices": new_devices,
"went_online": went_online,
"went_offline": went_offline,
},
)
if went_offline:
Device.objects.filter(
mac__in=map(attrgetter("mac"), went_offline)
Expand Down
Empty file.
61 changes: 0 additions & 61 deletions src/mainframe/finance/management/commands/import_stock_pnl.py

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Generated by Django 5.0.4 on 2024-11-12 17:58

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("finance", "0032_alter_account_type"),
]

operations = [
migrations.AddField(
model_name="pnl",
name="country",
field=models.CharField(default="US", max_length=2),
preserve_default=False,
),
migrations.AddField(
model_name="pnl",
name="isin",
field=models.CharField(default="default", max_length=12),
preserve_default=False,
),
migrations.AddField(
model_name="pnl",
name="security_name",
field=models.CharField(default="default", max_length=50),
preserve_default=False,
),
migrations.AddConstraint(
model_name="pnl",
constraint=models.UniqueConstraint(
fields=("date_acquired", "date_sold", "ticker", "quantity", "currency"),
name="finance_pnl_date_acquired_date_sold_ticker_quantity_currency_uniq",
),
),
]
10 changes: 10 additions & 0 deletions src/mainframe/finance/models/stocks.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,24 @@
class PnL(TimeStampedModel):
amount = models.DecimalField(decimal_places=2, max_digits=7)
cost_basis = models.DecimalField(decimal_places=2, max_digits=6)
country = models.CharField(max_length=2)
currency = models.CharField(max_length=3)
date_acquired = models.DateField()
date_sold = models.DateField()
isin = models.CharField(max_length=12)
pnl = models.DecimalField(decimal_places=2, max_digits=7)
quantity = models.DecimalField(decimal_places=8, max_digits=11)
security_name = models.CharField(max_length=50)
ticker = models.CharField(blank=True, max_length=5)

class Meta:
constraints = (
models.UniqueConstraint(
name="%(app_label)s_%(class)s_"
"date_acquired_date_sold_ticker_quantity_currency_uniq",
fields=("date_acquired", "date_sold", "ticker", "quantity", "currency"),
),
)
ordering = ["-date_sold", "-date_acquired", "ticker"]

def __str__(self):
Expand Down
29 changes: 28 additions & 1 deletion src/mainframe/finance/viewsets/stocks.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,32 @@
from django.db.models import Count, Q, Sum
from mainframe.clients.finance.stocks import (
StockImportError,
StockPnLImporter,
StockTransactionsImporter,
)
from mainframe.clients.logs import get_default_logger
from mainframe.finance.models import PnL, StockTransaction
from mainframe.finance.serializers import PnLSerializer, StockTransactionSerializer
from rest_framework import viewsets
from rest_framework import status, viewsets
from rest_framework.permissions import IsAdminUser
from rest_framework.response import Response


class PnLViewSet(viewsets.ModelViewSet):
permission_classes = (IsAdminUser,)
queryset = PnL.objects.all()
serializer_class = PnLSerializer

def create(self, request, *args, **kwargs):
file = request.FILES["file"]
logger = get_default_logger(__name__)
try:
StockPnLImporter(file, logger).run()
except StockImportError as e:
logger.error("Could not process file: %s - error: %s", file, e)
return Response(f"Invalid file: {file}", status.HTTP_400_BAD_REQUEST)
return self.list(request, *args, **kwargs)

def get_queryset(self):
queryset = super().get_queryset()
if currency := self.request.query_params.getlist("currency"):
Expand Down Expand Up @@ -50,6 +67,16 @@ class StocksViewSet(viewsets.ModelViewSet):
queryset = StockTransaction.objects.all()
serializer_class = StockTransactionSerializer

def create(self, request, *args, **kwargs):
file = request.FILES["file"]
logger = get_default_logger(__name__)
try:
StockTransactionsImporter(file, logger).run()
except StockImportError as e:
logger.error("Could not process file: %s - error: %s", file, e)
return Response(f"Invalid file: {file}", status.HTTP_400_BAD_REQUEST)
return self.list(request, *args, **kwargs)

def get_queryset(self):
queryset = super().get_queryset()
if currency := self.request.query_params.getlist("currency"):
Expand Down

0 comments on commit 10edf77

Please sign in to comment.