2020-04-19 08:34:05 +00:00
|
|
|
import enum
|
|
|
|
import io
|
|
|
|
import datetime
|
|
|
|
import csv
|
|
|
|
from flask import redirect, flash, request, url_for, make_response, current_app
|
2020-03-29 18:34:18 +00:00
|
|
|
import flask_admin
|
2020-03-31 14:04:36 +00:00
|
|
|
from formity.extensions import admin, db, ModelView, ModelViewHighSecurity, AdminSecurityMixin
|
2020-04-17 15:18:44 +00:00
|
|
|
from wtforms import TextAreaField, validators
|
2020-03-31 14:04:36 +00:00
|
|
|
from formity.models import FaceshieldRequest, RequestChange, Status, PostalCode, ExternalUser
|
2020-03-27 18:04:29 +00:00
|
|
|
from spaceauth import current_user
|
2020-04-08 18:09:24 +00:00
|
|
|
from flask_weasyprint import HTML, render_pdf
|
2020-04-16 21:26:47 +00:00
|
|
|
from sqlalchemy import func
|
2020-03-27 18:04:29 +00:00
|
|
|
|
2020-03-26 09:09:44 +00:00
|
|
|
|
2020-03-29 18:34:18 +00:00
|
|
|
class IndexView(AdminSecurityMixin, flask_admin.AdminIndexView):
|
|
|
|
@flask_admin.expose('/')
|
|
|
|
def index(self):
|
|
|
|
stats = FaceshieldRequest.query.with_entities(
|
|
|
|
FaceshieldRequest.status.label('status'),
|
2020-04-04 11:03:44 +00:00
|
|
|
FaceshieldRequest.handling_orga.label('handling_orga'),
|
2020-03-29 18:34:18 +00:00
|
|
|
func.count().label('count'),
|
|
|
|
func.sum(FaceshieldRequest.faceshield_full_required).label('faceshield_full_required'),
|
|
|
|
func.sum(FaceshieldRequest.faceshield_full_delivered).label('faceshield_full_delivered'),
|
|
|
|
func.sum(FaceshieldRequest.faceshield_front_required).label('faceshield_front_required'),
|
|
|
|
func.sum(FaceshieldRequest.faceshield_front_delivered).label('faceshield_front_delivered'),
|
2020-04-04 11:03:44 +00:00
|
|
|
).filter(FaceshieldRequest.status != Status.rejected, FaceshieldRequest.status != Status.spam).group_by(FaceshieldRequest.status, FaceshieldRequest.handling_orga).order_by(FaceshieldRequest.status, FaceshieldRequest.handling_orga).all()
|
2020-03-29 18:34:18 +00:00
|
|
|
|
2020-03-30 21:31:21 +00:00
|
|
|
vstats = FaceshieldRequest.query.select_from(FaceshieldRequest).with_entities(
|
2020-04-01 09:03:37 +00:00
|
|
|
func.coalesce(PostalCode.voivodeship, 'unknown').label('voivodeship'),
|
2020-03-30 21:31:21 +00:00
|
|
|
func.count().label('count'),
|
|
|
|
func.sum(FaceshieldRequest.faceshield_full_required).label('faceshield_full_required'),
|
|
|
|
func.sum(FaceshieldRequest.faceshield_full_delivered).label('faceshield_full_delivered'),
|
|
|
|
func.sum(FaceshieldRequest.faceshield_front_required).label('faceshield_front_required'),
|
|
|
|
func.sum(FaceshieldRequest.faceshield_front_delivered).label('faceshield_front_delivered'),
|
2020-04-01 09:03:37 +00:00
|
|
|
).filter(
|
|
|
|
FaceshieldRequest.status != Status.rejected,
|
|
|
|
FaceshieldRequest.status != Status.spam,
|
|
|
|
).join(FaceshieldRequest.postalcode_info, isouter=True).group_by('voivodeship').order_by(func.count().desc()).all()
|
2020-03-29 18:34:18 +00:00
|
|
|
|
2020-03-30 21:36:35 +00:00
|
|
|
dstats = FaceshieldRequest.query.select_from(FaceshieldRequest).with_entities(
|
|
|
|
func.date_trunc('day', FaceshieldRequest.created).label('date'),
|
|
|
|
func.count().label('count'),
|
2020-03-31 14:10:02 +00:00
|
|
|
).filter(FaceshieldRequest.status != Status.rejected, FaceshieldRequest.status != Status.spam).group_by(func.date_trunc('day', FaceshieldRequest.created)).order_by(func.date_trunc('day', FaceshieldRequest.created)).all()
|
2020-03-30 21:36:35 +00:00
|
|
|
|
|
|
|
return self.render('admin_index.html', stats=stats, vstats=vstats, dstats=dstats)
|
2020-03-29 18:34:18 +00:00
|
|
|
|
|
|
|
|
2020-04-07 18:59:51 +00:00
|
|
|
class MapView(AdminSecurityMixin, flask_admin.BaseView):
|
|
|
|
@flask_admin.expose('/')
|
|
|
|
def index(self):
|
2020-04-14 20:18:22 +00:00
|
|
|
mode = request.args.get('mode', 'all')
|
|
|
|
if mode == 'new':
|
|
|
|
query = FaceshieldRequest.query.filter(FaceshieldRequest.shipping_latitude != None, FaceshieldRequest.status == Status.new)
|
|
|
|
else:
|
|
|
|
query = FaceshieldRequest.query.filter(FaceshieldRequest.shipping_latitude != None, FaceshieldRequest.status != Status.spam, FaceshieldRequest.status != Status.rejected)
|
|
|
|
|
2020-04-07 18:59:51 +00:00
|
|
|
mapdata = [
|
|
|
|
{
|
|
|
|
key: getattr(request, key).name if isinstance(getattr(request, key), enum.Enum) else getattr(request, key)
|
2020-04-14 20:30:16 +00:00
|
|
|
for key in ['id', 'entity_info', 'shipping_latitude', 'shipping_longitude', 'status', 'handling_orga', 'extra', 'remarks', 'faceshield_full_required']
|
2020-04-07 18:59:51 +00:00
|
|
|
}
|
2020-04-14 20:18:22 +00:00
|
|
|
for request in query
|
2020-04-07 18:59:51 +00:00
|
|
|
]
|
|
|
|
|
2020-04-08 16:25:55 +00:00
|
|
|
return self.render('admin_map.html', mapdata=mapdata, focus=request.args.get('id', None))
|
2020-04-07 18:59:51 +00:00
|
|
|
|
|
|
|
|
2020-03-27 16:51:10 +00:00
|
|
|
class FaceshieldRequestAdmin(ModelView):
|
2020-03-29 12:37:42 +00:00
|
|
|
column_default_sort = 'created'
|
2020-03-27 18:04:29 +00:00
|
|
|
details_modal_template = 'changelog_details_modal.html'
|
|
|
|
edit_template = 'changelog_edit.html'
|
2020-04-08 16:25:55 +00:00
|
|
|
list_template = 'faceshieldrequest_list.html'
|
2020-03-27 18:04:29 +00:00
|
|
|
|
2020-04-07 16:25:30 +00:00
|
|
|
column_searchable_list = ('id', 'email', 'remarks', 'extra', 'entity_info', 'full_name')
|
2020-03-27 16:51:10 +00:00
|
|
|
column_filters = (
|
2020-04-07 16:25:30 +00:00
|
|
|
'id',
|
2020-03-27 16:51:10 +00:00
|
|
|
'entity_info', 'full_name', 'phone_number', 'email', 'extra',
|
|
|
|
'faceshield_front_required', 'faceshield_model',
|
2020-04-16 21:26:47 +00:00
|
|
|
'faceshield_front_delivered',
|
|
|
|
'faceshield_full_required', 'faceshield_full_delivered',
|
|
|
|
'adapter_3m_dar_required', 'adapter_3m_dar_delivered',
|
|
|
|
'adapter_easybreath_dar_required', 'adapter_easybreath_dar_delivered',
|
|
|
|
'adapter_rd40_dar_required', 'adapter_rd40_dar_delivered',
|
|
|
|
'adapter_secura_dar_required', 'adapter_secura_dar_delivered',
|
|
|
|
'handling_orga',
|
2020-03-27 18:04:29 +00:00
|
|
|
'created', 'ua', 'ip', 'status', 'remarks',
|
2020-04-16 21:27:25 +00:00
|
|
|
'parent_id',
|
2020-03-29 14:02:42 +00:00
|
|
|
'shipping_name', 'shipping_street', 'shipping_postalcode', 'shipping_city',
|
2020-04-19 11:29:58 +00:00
|
|
|
'shipping_latitude', 'shipping_longitude', 'shipping_provider', 'shipping_id',
|
2020-03-29 14:02:42 +00:00
|
|
|
'postalcode_info',
|
2020-03-27 16:51:10 +00:00
|
|
|
)
|
2020-03-26 09:09:44 +00:00
|
|
|
|
2020-03-29 14:02:42 +00:00
|
|
|
form_overrides = {'entity_info': TextAreaField, 'extra': TextAreaField, 'remarks': TextAreaField}
|
2020-04-17 15:18:44 +00:00
|
|
|
form_args = {
|
2020-04-19 11:28:37 +00:00
|
|
|
'shipping_name': {'validators': [validators.Length(max=35)]},
|
2020-04-17 15:18:44 +00:00
|
|
|
}
|
|
|
|
|
2020-03-29 14:02:42 +00:00
|
|
|
form_excluded_columns = ('changelog', 'postalcode_info')
|
|
|
|
|
2020-04-09 08:39:01 +00:00
|
|
|
column_export_list = column_filters
|
2020-04-07 16:34:33 +00:00
|
|
|
column_labels = {
|
|
|
|
'faceshield_front_required': 'Front required',
|
|
|
|
'faceshield_full_required': 'Full required',
|
|
|
|
'faceshield_front_delivered': 'Front delivered',
|
|
|
|
'faceshield_full_delivered': 'Full delivered',
|
|
|
|
}
|
2020-03-28 22:01:03 +00:00
|
|
|
|
2020-04-07 16:34:33 +00:00
|
|
|
column_list = ('id', 'entity_info', 'full_name', 'faceshield_full_required', 'faceshield_full_delivered', 'faceshield_front_required', 'faceshield_front_delivered', 'handling_orga', 'created', 'status')
|
2020-04-04 11:03:44 +00:00
|
|
|
column_editable_list = ('status', 'remarks', 'handling_orga')
|
|
|
|
form_choices = {
|
|
|
|
'handling_orga': [
|
2020-04-07 16:34:58 +00:00
|
|
|
('hswaw', 'hswaw'),
|
|
|
|
('hskrk', 'hskrk'),
|
|
|
|
('hswro', 'hswro'),
|
2020-04-04 11:03:44 +00:00
|
|
|
],
|
2020-04-17 15:18:44 +00:00
|
|
|
'shipping_provider': [
|
|
|
|
('kurjerzy', 'Kurjerzy'),
|
|
|
|
('xbs', 'XBS Group'),
|
|
|
|
],
|
2020-04-04 11:03:44 +00:00
|
|
|
}
|
2020-03-27 18:04:29 +00:00
|
|
|
|
|
|
|
can_delete = False
|
|
|
|
can_view_details = True
|
|
|
|
details_modal = True
|
2020-03-28 22:08:27 +00:00
|
|
|
can_set_page_size = True
|
2020-03-27 18:04:29 +00:00
|
|
|
|
2020-03-31 14:04:36 +00:00
|
|
|
@property
|
|
|
|
def can_export(self):
|
|
|
|
return not current_user.external
|
|
|
|
|
2020-04-08 18:09:24 +00:00
|
|
|
@flask_admin.expose('/label/')
|
|
|
|
def label(self):
|
|
|
|
return render_pdf(HTML(string=self.label_html()))
|
|
|
|
|
|
|
|
@flask_admin.expose('/label/html')
|
|
|
|
def label_html(self):
|
2020-04-12 13:16:13 +00:00
|
|
|
model = self.get_one(request.args.get('id'))
|
2020-04-14 16:18:07 +00:00
|
|
|
return self.render('label.html', models=[model])
|
2020-04-13 13:15:45 +00:00
|
|
|
|
|
|
|
def bulk_status_change(self, ids, status):
|
|
|
|
try:
|
|
|
|
query = self.get_query().filter(FaceshieldRequest.id.in_(ids))
|
|
|
|
|
|
|
|
count = 0
|
|
|
|
for req in query.all():
|
|
|
|
if req.status != status:
|
|
|
|
req.status = status
|
|
|
|
count += 1
|
|
|
|
|
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
flash('{} requests were successfully marked as {}.'.format(count, status.name))
|
|
|
|
except Exception as ex:
|
|
|
|
if not self.handle_view_exception(ex):
|
|
|
|
raise
|
|
|
|
|
|
|
|
flash('Failed to mark request as {}: {}'.format(status.name, str(ex)), 'error')
|
|
|
|
|
|
|
|
@flask_admin.actions.action('new', 'Mark as new', 'Are you sure you want to mark as new?')
|
|
|
|
def action_new(self, ids):
|
|
|
|
self.bulk_status_change(ids, Status.new)
|
|
|
|
|
|
|
|
@flask_admin.actions.action('fulfilled', 'Mark as fulfilled', 'Are you sure you want to mark as fulfilled?')
|
|
|
|
def action_fulfilled(self, ids):
|
|
|
|
self.bulk_status_change(ids, Status.fulfilled)
|
|
|
|
|
|
|
|
@flask_admin.actions.action('intransit', 'Mark as intransit', 'Are you sure you want to mark as intransit?')
|
|
|
|
def action_intransit(self, ids):
|
|
|
|
self.bulk_status_change(ids, Status.intransit)
|
|
|
|
|
|
|
|
@flask_admin.actions.action('shippingpending', 'Mark as shippingpending', 'Are you sure you want to mark as shippingpending?')
|
|
|
|
def action_shippingpending(self, ids):
|
|
|
|
self.bulk_status_change(ids, Status.shippingpending)
|
|
|
|
|
|
|
|
@flask_admin.actions.action('pickuppending', 'Mark as pickuppending', 'Are you sure you want to mark as pickuppending?')
|
|
|
|
def action_pickuppending(self, ids):
|
|
|
|
self.bulk_status_change(ids, Status.pickuppending)
|
|
|
|
|
2020-04-14 16:18:07 +00:00
|
|
|
@flask_admin.actions.action('bulkprint', 'Print')
|
|
|
|
def action_bulkprint(self, ids):
|
|
|
|
models = self.get_query().filter(FaceshieldRequest.id.in_(ids)).all()
|
|
|
|
return render_pdf(HTML(string=self.render('label.html', models=models)))
|
2020-04-13 13:15:45 +00:00
|
|
|
|
2020-04-19 08:34:05 +00:00
|
|
|
@flask_admin.actions.action('csv_kurjerzy', 'Export Kurjerzy.pl CSV')
|
|
|
|
def action_csv_kurjerzy(self, ids):
|
|
|
|
models = self.get_query().filter(FaceshieldRequest.id.in_(ids)).all()
|
|
|
|
fields = [
|
|
|
|
'kurier',
|
|
|
|
'nadawca_nazwa', 'nadawca_email', 'nadawca_ulica',
|
|
|
|
'nadawca_nr_lok', 'nadawca_kod', 'nadawca_miasto',
|
|
|
|
'nadawca_telefon', 'nadawca_kraj', 'nadawca_region',
|
|
|
|
'nadawca_punkt',
|
|
|
|
|
|
|
|
'odbiorca_nazwa', 'odbiorca_email', 'odbiorca_ulica',
|
|
|
|
'odbiorca_nr_lok', 'odbiorca_kod', 'odbiorca_miasto',
|
|
|
|
'odbiorca_telefon', 'odbiorca_kraj', 'odbiorca_region',
|
|
|
|
'odbiorca_punkt',
|
|
|
|
|
|
|
|
'przesylka_rodzaj', 'przesylka_opakowanie', 'przesylka_waga',
|
|
|
|
'przesylka_szerokosc', 'przesylka_wysokosc', 'przesylka_dlugosc',
|
|
|
|
'przesylka_wartosc', 'przesylka_zawartosc',
|
|
|
|
|
|
|
|
'pobranie_wartosc', 'pobranie_nr_bank', 'pobranie_1_dzien',
|
|
|
|
'sms_nadawca', 'sms_odbiorca', 'dostawa_nast_dnia',
|
|
|
|
'dokumenty_zwrotne', 'bez_odbioru', 'numer_ref', 'kod_promo'
|
|
|
|
]
|
|
|
|
|
|
|
|
fname = 'kurjerzy-export-%s.csv' % (datetime.datetime.now().strftime(r'%Y%m%d-%H%M%S'),)
|
|
|
|
|
|
|
|
si = io.StringIO()
|
|
|
|
writer = csv.DictWriter(si, fields, delimiter=';')
|
|
|
|
writer.writeheader()
|
|
|
|
|
|
|
|
config = current_app.config
|
|
|
|
for row in models:
|
|
|
|
writer.writerow({
|
|
|
|
'kurier': 'ups',
|
|
|
|
'nadawca_nazwa': config['SHIPPING_SENDER_NAME'],
|
|
|
|
'nadawca_email': config['SHIPPING_SENDER_EMAIL'],
|
|
|
|
'nadawca_ulica': config['SHIPPING_SENDER_STREET'],
|
|
|
|
'nadawca_nr_lok': config['SHIPPING_SENDER_NUMBER'],
|
|
|
|
'nadawca_kod': config['SHIPPING_SENDER_POSTALCODE'],
|
|
|
|
'nadawca_miasto': config['SHIPPING_SENDER_CITY'],
|
|
|
|
'nadawca_telefon': config['SHIPPING_SENDER_PHONE_NUMBER'],
|
|
|
|
'nadawca_kraj': 'PL',
|
|
|
|
'odbiorca_nazwa': row.shipping_name,
|
|
|
|
'odbiorca_email': row.email,
|
|
|
|
'odbiorca_ulica': row.shipping_street,
|
|
|
|
'odbiorca_nr_lok': '1/1', # FIXME
|
|
|
|
'odbiorca_kod': row.shipping_postalcode,
|
|
|
|
'odbiorca_miasto': row.shipping_city,
|
|
|
|
'odbiorca_telefon': row.phone_number,
|
|
|
|
'odbiorca_kraj': 'PL',
|
|
|
|
|
|
|
|
# TODO
|
|
|
|
'przesylka_rodzaj': 1,
|
|
|
|
'przesylka_opakowanie': 1,
|
|
|
|
'przesylka_waga': 4,
|
|
|
|
'przesylka_szerokosc': 40,
|
|
|
|
'przesylka_wysokosc': 30,
|
|
|
|
'przesylka_dlugosc': 20,
|
|
|
|
'przesylka_wartosc': 100,
|
|
|
|
|
|
|
|
'przesylka_zawartosc': 'przyłbice dla medyków %d' % (row.id,),
|
|
|
|
'sms_odbiorca': 1,
|
|
|
|
'dostawa_nast_dnia': 1,
|
|
|
|
})
|
|
|
|
|
|
|
|
row.changelog.append(RequestChange(
|
|
|
|
remarks='included on Kurjerzy export (%s)' % (fname,),
|
|
|
|
))
|
|
|
|
|
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
output = make_response(si.getvalue())
|
|
|
|
output.headers["Content-Disposition"] = "attachment; filename=%s" % (fname,)
|
|
|
|
output.headers["Content-type"] = "text/csv"
|
|
|
|
return output
|
|
|
|
|
|
|
|
@flask_admin.actions.action('csv_xbs', 'Export XBS Group/DPD CSV')
|
|
|
|
def action_csv_xbs(self, ids):
|
|
|
|
models = self.get_query().filter(FaceshieldRequest.id.in_(ids)).all()
|
|
|
|
fields = [
|
|
|
|
'NAZWA NADAWCY', 'OSOBA KONTAKTOWA NADAWCA',
|
|
|
|
'TELEFON KONTAKTOWY NADAWCA ', 'ULICA NADAWCA',
|
|
|
|
'KOD POCZTOWY NADAWCA', 'MIASTO NADAWCA',
|
|
|
|
|
|
|
|
'NAZWA ODBIORCA', 'OSOBA KONTAKTOWA ODBIORCA',
|
|
|
|
'TELEFON KONTAKTOWYODBIORCA', 'ULICA ODBIORCA',
|
|
|
|
'KOD POCZTOWY ODBIORCA', 'MIASTO ODBIORCA',
|
|
|
|
|
|
|
|
'WAGA', 'ILOŚĆ PACZEK', 'NUMKAT', 'NEXT DAY', 'SOBOTA',
|
|
|
|
'GWARANT 9:30', 'GWARANT 12:00', 'DZ', 'COD', 'WARTOŚĆ',
|
|
|
|
'NR REFERENCYJNY 1', 'NR REFERENCYJNY 2',
|
|
|
|
'ZAWARTOŚĆ', 'UWAGII',
|
|
|
|
]
|
|
|
|
|
|
|
|
fname = 'xbs-dpd-export-%s.csv' % (datetime.datetime.now().strftime(r'%Y%m%d-%H%M%S'),)
|
|
|
|
|
|
|
|
si = io.StringIO()
|
|
|
|
writer = csv.DictWriter(si, fields)
|
|
|
|
writer.writeheader()
|
|
|
|
config = current_app.config
|
|
|
|
for row in models:
|
|
|
|
writer.writerow({
|
|
|
|
'NAZWA NADAWCY': config['SHIPPING_SENDER_NAME'],
|
|
|
|
'OSOBA KONTAKTOWA NADAWCA': config['SHIPPING_SENDER_NAME2'],
|
|
|
|
'ULICA NADAWCA': '%s %s' % (config['SHIPPING_SENDER_STREET'], config['SHIPPING_SENDER_NUMBER']),
|
|
|
|
'KOD POCZTOWY NADAWCA': config['SHIPPING_SENDER_POSTALCODE'],
|
|
|
|
'MIASTO NADAWCA': config['SHIPPING_SENDER_CITY'],
|
|
|
|
'TELEFON KONTAKTOWY NADAWCA ': config['SHIPPING_SENDER_PHONE_NUMBER'],
|
|
|
|
|
|
|
|
'NAZWA ODBIORCA': row.shipping_name,
|
|
|
|
'OSOBA KONTAKTOWA ODBIORCA': row.full_name,
|
|
|
|
'TELEFON KONTAKTOWYODBIORCA': row.phone_number,
|
|
|
|
'ULICA ODBIORCA': row.shipping_street,
|
|
|
|
'KOD POCZTOWY ODBIORCA': row.shipping_postalcode,
|
|
|
|
'MIASTO ODBIORCA': row.shipping_city,
|
|
|
|
|
|
|
|
# TODO kartony?
|
|
|
|
'WAGA': 12,
|
|
|
|
'ILOŚĆ PACZEK': 1,
|
|
|
|
'NR REFERENCYJNY 1': row.id,
|
|
|
|
'ZAWARTOŚĆ': 'przyłbice dla medyków',
|
|
|
|
})
|
|
|
|
|
|
|
|
row.changelog.append(RequestChange(
|
|
|
|
remarks='included on XBS export (%s)' % (fname,),
|
|
|
|
))
|
|
|
|
|
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
output = make_response(si.getvalue())
|
|
|
|
output.headers["Content-Disposition"] = "attachment; filename=%s" % (fname,)
|
|
|
|
output.headers["Content-type"] = "text/csv"
|
|
|
|
return output
|
|
|
|
|
|
|
|
@flask_admin.actions.action('create_shipment', 'Create Kurjerzy shipment')
|
|
|
|
def action_create_shipment(self, ids):
|
|
|
|
from shipping.kurjerzy import Kurjerzy
|
|
|
|
|
|
|
|
models = self.get_query().filter(FaceshieldRequest.id.in_(ids)).all()
|
|
|
|
|
|
|
|
k = Kurjerzy(current_app)
|
|
|
|
k.authenticate()
|
|
|
|
|
2020-04-19 11:28:37 +00:00
|
|
|
created = 0
|
2020-04-19 08:34:05 +00:00
|
|
|
for model in models:
|
2020-04-19 11:28:37 +00:00
|
|
|
try:
|
|
|
|
if model.shipping_id is not None or model.shipping_provider is not None:
|
|
|
|
if k.shipment_info(model.shipping_id):
|
|
|
|
flash('Ignoring #%s (shipment already created)' % (model.id,), 'warning')
|
|
|
|
continue
|
|
|
|
k.create_shipment(model)
|
|
|
|
db.session.commit()
|
|
|
|
created += 1
|
|
|
|
except Exception as exc:
|
|
|
|
flash('Shipment creation failed for #%s: %s' % (model.id, exc), 'error')
|
|
|
|
return
|
|
|
|
|
|
|
|
if created:
|
|
|
|
flash('%d shipments created' % (created,), 'info')
|
2020-04-19 08:34:05 +00:00
|
|
|
|
2020-03-29 12:37:42 +00:00
|
|
|
class FilteredFaceshieldRequestAdmin(FaceshieldRequestAdmin):
|
|
|
|
def get_query(self):
|
2020-04-09 16:57:47 +00:00
|
|
|
return super(FilteredFaceshieldRequestAdmin, self).get_query().filter(~FaceshieldRequest.status.in_([Status.rejected, Status.spam, Status.fulfilled, Status.delegated]))
|
2020-03-30 21:13:25 +00:00
|
|
|
|
|
|
|
def get_count_query(self):
|
2020-04-09 16:57:47 +00:00
|
|
|
return super(FilteredFaceshieldRequestAdmin, self).get_count_query().filter(~FaceshieldRequest.status.in_([Status.rejected, Status.spam, Status.fulfilled, Status.delegated]))
|
2020-03-29 12:37:42 +00:00
|
|
|
|
2020-04-04 11:09:10 +00:00
|
|
|
class ShippingFaceshieldRequestAdmin(FilteredFaceshieldRequestAdmin):
|
2020-04-09 08:39:01 +00:00
|
|
|
column_editable_list = ('shipping_name', 'shipping_street', 'shipping_postalcode', 'shipping_city', 'shipping_latitude', 'shipping_longitude', 'status')
|
2020-03-29 12:37:42 +00:00
|
|
|
column_list = ['id', 'entity_info', 'full_name', *column_editable_list]
|
2020-03-27 16:51:10 +00:00
|
|
|
|
2020-03-31 14:04:36 +00:00
|
|
|
|
|
|
|
class ExternalUserAdmin(ModelViewHighSecurity):
|
|
|
|
column_default_sort = 'id'
|
|
|
|
column_list = ('id', 'email', 'password', 'remarks')
|
|
|
|
form_columns = ('email', 'password', 'remarks')
|
|
|
|
|
|
|
|
can_delete = True
|
|
|
|
|
2020-04-13 13:15:54 +00:00
|
|
|
class ChangelogAdmin(ModelView):
|
|
|
|
can_delete = False
|
|
|
|
can_edit = False
|
|
|
|
can_set_page_size = True
|
|
|
|
can_create = False
|
|
|
|
column_list = ('user_id', 'request', 'state_after', 'created')
|
|
|
|
column_filters = ('request_id', 'request', 'user_id', 'created')
|
2020-04-13 13:52:07 +00:00
|
|
|
column_default_sort = ('created', True)
|
2020-04-13 13:15:54 +00:00
|
|
|
|
2020-03-30 21:13:25 +00:00
|
|
|
admin.add_view(FilteredFaceshieldRequestAdmin(FaceshieldRequest, db.session))
|
|
|
|
admin.add_view(FaceshieldRequestAdmin(FaceshieldRequest, db.session, name='FaceshieldRequest (Unfiltered)', endpoint='request_unfiltered'))
|
2020-03-29 12:37:42 +00:00
|
|
|
admin.add_view(ShippingFaceshieldRequestAdmin(FaceshieldRequest, db.session, name='FaceshieldRequest (Shipping)', endpoint='request_shipping'))
|
2020-03-31 14:04:36 +00:00
|
|
|
admin.add_view(ExternalUserAdmin(ExternalUser, db.session, name='External Users', endpoint='external_user'))
|
2020-04-07 18:59:51 +00:00
|
|
|
admin.add_view(MapView(name='Map', endpoint='map'))
|
2020-04-13 13:15:54 +00:00
|
|
|
admin.add_view(ChangelogAdmin(RequestChange, db.session))
|