mirror of
https://github.com/RoboSats/robosats.git
synced 2024-09-11 14:05:51 +03:00
Add background task for expired orders removal
This commit is contained in:
parent
2cbc82a535
commit
28bfaee937
@ -45,7 +45,8 @@ class UserProfileAdmin(AdminChangeLinksMixin, admin.ModelAdmin):
|
||||
|
||||
@admin.register(Currency)
|
||||
class CurrencieAdmin(admin.ModelAdmin):
|
||||
list_display = ('currency','exchange_rate','timestamp')
|
||||
list_display = ('id','currency','exchange_rate','timestamp')
|
||||
list_display_links = ('id','currency')
|
||||
readonly_fields = ('currency','exchange_rate','timestamp')
|
||||
|
||||
@admin.register(MarketTick)
|
||||
|
@ -95,13 +95,23 @@ class Logics():
|
||||
|
||||
return price, premium
|
||||
|
||||
def order_expires(order):
|
||||
@classmethod
|
||||
def order_expires(cls, order):
|
||||
''' General case when time runs out. Only
|
||||
used when the maker does not lock a publishing bond'''
|
||||
order.status = Order.Status.EXP
|
||||
order.maker = None
|
||||
order.taker = None
|
||||
order.save()
|
||||
|
||||
if order.status == Order.Status.WFB:
|
||||
order.status = Order.Status.EXP
|
||||
order.maker = None
|
||||
order.taker = None
|
||||
order.save()
|
||||
|
||||
if order.status == Order.Status.PUB:
|
||||
cls.return_bond(order.maker_bond)
|
||||
order.status = Order.Status.EXP
|
||||
order.maker = None
|
||||
order.taker = None
|
||||
order.save()
|
||||
|
||||
def kick_taker(order):
|
||||
''' The taker did not lock the taker_bond. Now he has to go'''
|
||||
|
44
api/tasks.py
44
api/tasks.py
@ -11,6 +11,7 @@ from datetime import timedelta
|
||||
from django.utils import timezone
|
||||
|
||||
from decouple import config
|
||||
import time
|
||||
|
||||
@shared_task(name="users_cleansing")
|
||||
def users_cleansing():
|
||||
@ -42,18 +43,51 @@ def users_cleansing():
|
||||
|
||||
|
||||
@shared_task(name="orders_expire")
|
||||
def orders_expire():
|
||||
pass
|
||||
def orders_expire(rest_secs):
|
||||
'''
|
||||
Continuously checks order expiration times for 1 hour.
|
||||
If order is expires, it handles the actions.
|
||||
'''
|
||||
now = timezone.now()
|
||||
end_time = now + timedelta(hours=1)
|
||||
context = []
|
||||
|
||||
while now < end_time:
|
||||
queryset = Order.objects.exclude(status=Order.Status.EXP).exclude(status=Order.Status.UCA).exclude(status= Order.Status.CCA)
|
||||
queryset = queryset.filter(expires_at__lt=now) # expires at lower than now
|
||||
|
||||
for order in queryset:
|
||||
context.append(str(order)+ " was "+ Order.Status(order.status).label)
|
||||
Logics.order_expires(order)
|
||||
|
||||
# Allow for some thread rest.
|
||||
time.sleep(rest_secs)
|
||||
|
||||
# Update 'now' for a new loop
|
||||
now = timezone.now()
|
||||
|
||||
results = {
|
||||
'num_expired': len(context),
|
||||
'expired_orders_context': context,
|
||||
'rest_param': rest_secs,
|
||||
}
|
||||
|
||||
return results
|
||||
|
||||
@shared_task
|
||||
def follow_lnd_payment():
|
||||
''' Makes a payment and follows it.
|
||||
Updates the LNpayment object, and retries
|
||||
until payment is done'''
|
||||
pass
|
||||
|
||||
@shared_task
|
||||
def query_all_lnd_invoices():
|
||||
def follow_lnd_hold_invoice():
|
||||
''' Follows and updates LNpayment object
|
||||
until settled or canceled'''
|
||||
pass
|
||||
|
||||
@shared_task(name="cache_market", ignore_result=True)
|
||||
@shared_task(name="cache_external_market_prices", ignore_result=True)
|
||||
def cache_market():
|
||||
exchange_rates = get_exchange_rates(list(Currency.currency_dict.values()))
|
||||
results = {}
|
||||
@ -65,7 +99,7 @@ def cache_market():
|
||||
Currency.objects.update_or_create(
|
||||
id = int(val),
|
||||
currency = int(val),
|
||||
# if there is a Cached Exchange rate matching that value, it updates it with defaults below
|
||||
# if there is a Cached market prices matching that id, it updates it with defaults below
|
||||
defaults = {
|
||||
'exchange_rate': rate,
|
||||
'timestamp': timezone.now(),
|
||||
|
@ -2,6 +2,8 @@ import React, { Component } from 'react';
|
||||
import { Paper, Alert, AlertTitle, Button , Grid, Typography, TextField, Select, FormHelperText, MenuItem, FormControl, Radio, FormControlLabel, RadioGroup, Menu} from "@mui/material"
|
||||
import { Link } from 'react-router-dom'
|
||||
|
||||
import getFlags from './getFlags'
|
||||
|
||||
function getCookie(name) {
|
||||
let cookieValue = null;
|
||||
if (document.cookie && document.cookie !== '') {
|
||||
@ -190,7 +192,9 @@ export default class MakerPage extends Component {
|
||||
>
|
||||
{
|
||||
Object.entries(this.state.currencies_dict)
|
||||
.map( ([key, value]) => <MenuItem value={parseInt(key)}>{value}</MenuItem> )
|
||||
.map( ([key, value]) => <MenuItem value={parseInt(key)}>
|
||||
{getFlags(value) + " " + value}
|
||||
</MenuItem> )
|
||||
}
|
||||
</Select>
|
||||
|
||||
|
@ -2,6 +2,7 @@ import React, { Component } from "react";
|
||||
import { Alert, Paper, CircularProgress, Button , Grid, Typography, List, ListItem, ListItemIcon, ListItemText, ListItemAvatar, Avatar, Divider, Box, LinearProgress} from "@mui/material"
|
||||
import Countdown, { zeroPad, calcTimeDelta } from 'react-countdown';
|
||||
import TradeBox from "./TradeBox";
|
||||
import getFlags from './getFlags'
|
||||
|
||||
// icons
|
||||
import AccessTimeIcon from '@mui/icons-material/AccessTime';
|
||||
@ -281,9 +282,10 @@ export default class OrderPage extends Component {
|
||||
|
||||
<ListItem>
|
||||
<ListItemIcon>
|
||||
<MoneyIcon/>
|
||||
{getFlags(this.state.currencyCode)}
|
||||
</ListItemIcon>
|
||||
<ListItemText primary={parseFloat(parseFloat(this.state.amount).toFixed(4))+" "+this.state.currencyCode} secondary="Amount"/>
|
||||
<ListItemText primary={parseFloat(parseFloat(this.state.amount).toFixed(4))
|
||||
+" "+this.state.currencyCode} secondary="Amount"/>
|
||||
</ListItem>
|
||||
<Divider />
|
||||
<ListItem>
|
||||
|
@ -32,14 +32,18 @@ app.conf.beat_scheduler = 'django_celery_beat.schedulers:DatabaseScheduler'
|
||||
# Configure the periodic tasks
|
||||
app.conf.beat_schedule = {
|
||||
# User cleansing every 6 hours
|
||||
'users-cleansing': {
|
||||
'users-cleansing': { # Cleans abandoned users every 6 hours
|
||||
'task': 'users_cleansing',
|
||||
'schedule': timedelta(hours=6),
|
||||
'schedule': timedelta(hours=6),
|
||||
},
|
||||
|
||||
'cache-market-rates': {
|
||||
'task': 'cache_market',
|
||||
'schedule': timedelta(seconds=60), # Cache market prices every minutes for now.
|
||||
'cache-market-prices': { # Cache market prices every minutes for now.
|
||||
'task': 'cache_external_market_prices',
|
||||
'schedule': timedelta(seconds=60),
|
||||
},
|
||||
'orders_expire': { # Continuous order expire removal (1 hour long process, every hour reports results)
|
||||
'task': 'orders_expire',
|
||||
'schedule': timedelta(hours=1),
|
||||
'args': [5], # Rest between checks (secs)
|
||||
},
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user