diff --git a/apiserver/apiserver/api/views.py b/apiserver/apiserver/api/views.py index 22de65f..4e1d8ae 100644 --- a/apiserver/apiserver/api/views.py +++ b/apiserver/apiserver/api/views.py @@ -507,6 +507,8 @@ class TransactionViewSet(Base, List, Create, Retrieve, Update): def get_queryset(self): queryset = models.Transaction.objects month = self.request.query_params.get('month', '') + date = self.request.query_params.get('date', '') + member_id = self.request.query_params.get('member_id', '') exclude_paypal = self.request.query_params.get('exclude_paypal', '') == 'true' exclude_snacks = self.request.query_params.get('exclude_snacks', '') == 'true' exclude_dues = self.request.query_params.get('exclude_dues', '') == 'true' @@ -520,10 +522,22 @@ class TransactionViewSet(Base, List, Create, Retrieve, Update): queryset = queryset.filter(date__year=dt.year) queryset = queryset.filter(date__month=dt.month) queryset = queryset.exclude(category='Memberships:Fake Months') + elif date: + try: + dt = datetime.datetime.strptime(date, '%Y-%m-%d') + except ValueError: + raise exceptions.ValidationError(dict(date='Should be YYYY-MM-DD.')) + queryset = queryset.filter(date__year=dt.year) + queryset = queryset.filter(date__month=dt.month) + queryset = queryset.filter(date__day=dt.day) + queryset = queryset.exclude(category='Memberships:Fake Months') else: queryset = queryset.exclude(report_type__isnull=True) queryset = queryset.exclude(report_type='') + if member_id: + queryset = queryset.filter(user__member__id=member_id) + if exclude_paypal: queryset = queryset.exclude(account_type='PayPal') diff --git a/webclient/src/Home.js b/webclient/src/Home.js index fe2b1e4..f9d4998 100644 --- a/webclient/src/Home.js +++ b/webclient/src/Home.js @@ -397,7 +397,11 @@ export function Home(props) {
ORD3 printer: {printer3dStat('ord3')}
- {user &&Alarm status: {alarmStat()}
} + {user ? +Alarm status: {alarmStat()}
+ : +Alarm status: Unauthorized
+ } {user &&Hosting status: {closedStat()}
} diff --git a/webclient/src/Transactions.js b/webclient/src/Transactions.js index bd06e14..8ddd85d 100644 --- a/webclient/src/Transactions.js +++ b/webclient/src/Transactions.js @@ -12,10 +12,44 @@ export function TransactionEditor(props) { const { token, input, setInput, error } = props; const [prevInput] = useState(input); + const [prevTransactions, setPrevTransactions] = useState([]); + const [txError, setTxError] = useState(false); const handleValues = (e, v) => setInput({ ...input, [v.name]: v.value }); const handleChange = (e) => handleValues(e, e.currentTarget); + const checkPrevTransactions = (member_id, date) => { + console.log(member_id, date); + + const isValidISODate = /^\d{4}-\d{2}-\d{2}$/.test(date); + + if (!member_id || !isValidISODate) { + return; + } + + console.log('Checking previous transactions:', member_id, date); + + requester('/transactions/?date=' + date + '&member_id=' + member_id, 'GET', token) + .then(res => { + setTxError(false); + setPrevTransactions(res.results); + }) + .catch(err => { + console.log(err); + setTxError(true); + }); + }; + + const handleMemberValue = (e, v) => { + checkPrevTransactions(v.value, input.date); + handleValues(e, v); + }; + + const handleDateValue = (e) => { + checkPrevTransactions(input.member_id, e.currentTarget.value); + handleChange(e); + }; + const makeProps = (name) => ({ name: name, onChange: handleChange, @@ -70,18 +104,27 @@ export function TransactionEditor(props) {These are from the same member, same day.
+Error checking for duplicate transactions.
} +