mirror of
https://github.com/daniviga/django-ram.git
synced 2025-08-04 13:17:50 +02:00
Run black on py
This commit is contained in:
@@ -26,9 +26,7 @@ class Consist(models.Model):
|
|||||||
|
|
||||||
class ConsistItem(models.Model):
|
class ConsistItem(models.Model):
|
||||||
consist = models.ForeignKey(
|
consist = models.ForeignKey(
|
||||||
Consist,
|
Consist, on_delete=models.CASCADE, related_name="consist_item"
|
||||||
on_delete=models.CASCADE,
|
|
||||||
related_name="consist_item"
|
|
||||||
)
|
)
|
||||||
rolling_stock = models.ForeignKey(RollingStock, on_delete=models.CASCADE)
|
rolling_stock = models.ForeignKey(RollingStock, on_delete=models.CASCADE)
|
||||||
order = models.PositiveIntegerField(default=0, blank=False, null=False)
|
order = models.PositiveIntegerField(default=0, blank=False, null=False)
|
||||||
|
@@ -6,23 +6,16 @@ from solo.models import SingletonModel
|
|||||||
|
|
||||||
class DriverConfiguration(SingletonModel):
|
class DriverConfiguration(SingletonModel):
|
||||||
remote_host = models.GenericIPAddressField(
|
remote_host = models.GenericIPAddressField(
|
||||||
protocol="IPv4",
|
protocol="IPv4", default="192.168.4.1"
|
||||||
default="192.168.4.1"
|
|
||||||
)
|
)
|
||||||
remote_port = models.SmallIntegerField(default=2560)
|
remote_port = models.SmallIntegerField(default=2560)
|
||||||
timeout = models.SmallIntegerField(default=250)
|
timeout = models.SmallIntegerField(default=250)
|
||||||
|
|
||||||
network = models.GenericIPAddressField(
|
network = models.GenericIPAddressField(
|
||||||
protocol="IPv4",
|
protocol="IPv4", default="192.168.4.0", blank=True, null=True
|
||||||
default="192.168.4.0",
|
|
||||||
blank=True,
|
|
||||||
null=True
|
|
||||||
)
|
)
|
||||||
subnet_mask = models.GenericIPAddressField(
|
subnet_mask = models.GenericIPAddressField(
|
||||||
protocol="IPv4",
|
protocol="IPv4", default="255.255.255.0", blank=True, null=True
|
||||||
default="255.255.255.0",
|
|
||||||
blank=True,
|
|
||||||
null=True
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
@@ -31,8 +24,7 @@ class DriverConfiguration(SingletonModel):
|
|||||||
def clean(self, *args, **kwargs):
|
def clean(self, *args, **kwargs):
|
||||||
if self.network:
|
if self.network:
|
||||||
try:
|
try:
|
||||||
IPv4Network(
|
IPv4Network("{0}/{1}".format(self.network, self.subnet_mask))
|
||||||
"{0}/{1}".format(self.network, self.subnet_mask))
|
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
raise ValidationError(e)
|
raise ValidationError(e)
|
||||||
super().clean(*args, **kwargs)
|
super().clean(*args, **kwargs)
|
||||||
|
@@ -7,7 +7,7 @@ from rest_framework.response import Response
|
|||||||
from rest_framework.permissions import (
|
from rest_framework.permissions import (
|
||||||
IsAuthenticated,
|
IsAuthenticated,
|
||||||
BasePermission,
|
BasePermission,
|
||||||
SAFE_METHODS
|
SAFE_METHODS,
|
||||||
)
|
)
|
||||||
|
|
||||||
from ram.parsers import PlainTextParser
|
from ram.parsers import PlainTextParser
|
||||||
@@ -40,16 +40,15 @@ class Firewall(BasePermission):
|
|||||||
if not config.network:
|
if not config.network:
|
||||||
return request.method in SAFE_METHODS
|
return request.method in SAFE_METHODS
|
||||||
|
|
||||||
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
|
x_forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR")
|
||||||
if x_forwarded_for:
|
if x_forwarded_for:
|
||||||
ip = IPv4Address(x_forwarded_for.split(',')[0])
|
ip = IPv4Address(x_forwarded_for.split(",")[0])
|
||||||
else:
|
else:
|
||||||
ip = IPv4Address(request.META.get("REMOTE_ADDR"))
|
ip = IPv4Address(request.META.get("REMOTE_ADDR"))
|
||||||
|
|
||||||
network = IPv4Network("{0}/{1}".format(
|
network = IPv4Network(
|
||||||
config.network,
|
"{0}/{1}".format(config.network, config.subnet_mask)
|
||||||
config.subnet_mask
|
)
|
||||||
))
|
|
||||||
|
|
||||||
# accept IP configured is settings or localhost
|
# accept IP configured is settings or localhost
|
||||||
if ip in network or ip in IPv4Network("127.0.0.0/8"):
|
if ip in network or ip in IPv4Network("127.0.0.0/8"):
|
||||||
@@ -101,6 +100,7 @@ class Function(APIView):
|
|||||||
"""
|
"""
|
||||||
Send "Function" commands to a valid DCC address
|
Send "Function" commands to a valid DCC address
|
||||||
"""
|
"""
|
||||||
|
|
||||||
permission_classes = [IsAuthenticated | Firewall]
|
permission_classes = [IsAuthenticated | Firewall]
|
||||||
|
|
||||||
def put(self, request, address):
|
def put(self, request, address):
|
||||||
@@ -117,6 +117,7 @@ class Cab(APIView):
|
|||||||
"""
|
"""
|
||||||
Send "Cab" commands to a valid DCC address
|
Send "Cab" commands to a valid DCC address
|
||||||
"""
|
"""
|
||||||
|
|
||||||
permission_classes = [IsAuthenticated | Firewall]
|
permission_classes = [IsAuthenticated | Firewall]
|
||||||
|
|
||||||
def put(self, request, address):
|
def put(self, request, address):
|
||||||
@@ -132,6 +133,7 @@ class Infra(APIView):
|
|||||||
"""
|
"""
|
||||||
Send "Infra" commands to a valid DCC address
|
Send "Infra" commands to a valid DCC address
|
||||||
"""
|
"""
|
||||||
|
|
||||||
permission_classes = [IsAuthenticated | Firewall]
|
permission_classes = [IsAuthenticated | Firewall]
|
||||||
|
|
||||||
def put(self, request):
|
def put(self, request):
|
||||||
@@ -147,6 +149,7 @@ class Emergency(APIView):
|
|||||||
"""
|
"""
|
||||||
Send an "Emergency" stop, no matter the HTTP method used
|
Send an "Emergency" stop, no matter the HTTP method used
|
||||||
"""
|
"""
|
||||||
|
|
||||||
permission_classes = [IsAuthenticated | Firewall]
|
permission_classes = [IsAuthenticated | Firewall]
|
||||||
|
|
||||||
def put(self, request):
|
def put(self, request):
|
||||||
|
@@ -2,5 +2,5 @@ from django.apps import AppConfig
|
|||||||
|
|
||||||
|
|
||||||
class PortalConfig(AppConfig):
|
class PortalConfig(AppConfig):
|
||||||
default_auto_field = 'django.db.models.BigAutoField'
|
default_auto_field = "django.db.models.BigAutoField"
|
||||||
name = 'portal'
|
name = "portal"
|
||||||
|
@@ -7,14 +7,14 @@ from solo.models import SingletonModel
|
|||||||
|
|
||||||
class SiteConfiguration(SingletonModel):
|
class SiteConfiguration(SingletonModel):
|
||||||
site_name = models.CharField(
|
site_name = models.CharField(
|
||||||
max_length=256,
|
max_length=256, default="Railroad Assets Manager"
|
||||||
default="Railroad Assets Manager")
|
)
|
||||||
site_author = models.CharField(max_length=256, blank=True)
|
site_author = models.CharField(max_length=256, blank=True)
|
||||||
about = models.TextField(blank=True)
|
about = models.TextField(blank=True)
|
||||||
items_per_page = models.CharField(
|
items_per_page = models.CharField(
|
||||||
max_length=2, choices=[
|
max_length=2,
|
||||||
(str(x * 3), str(x * 3)) for x in range(2, 11)],
|
choices=[(str(x * 3), str(x * 3)) for x in range(2, 11)],
|
||||||
default='6'
|
default="6",
|
||||||
)
|
)
|
||||||
footer = models.TextField(blank=True)
|
footer = models.TextField(blank=True)
|
||||||
footer_extended = models.TextField(blank=True)
|
footer_extended = models.TextField(blank=True)
|
||||||
|
@@ -9,4 +9,4 @@ register = template.Library()
|
|||||||
@register.filter
|
@register.filter
|
||||||
@stringfilter
|
@stringfilter
|
||||||
def markdown(value):
|
def markdown(value):
|
||||||
return md.markdown(value, extensions=['markdown.extensions.fenced_code'])
|
return md.markdown(value, extensions=["markdown.extensions.fenced_code"])
|
||||||
|
@@ -3,16 +3,20 @@ from django.urls import path
|
|||||||
from portal.views import GetHome, GetHomeFiltered, GetRollingStock
|
from portal.views import GetHome, GetHomeFiltered, GetRollingStock
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("", GetHome.as_view(), name='index'),
|
path("", GetHome.as_view(), name="index"),
|
||||||
path("<int:page>", GetHome.as_view(), name='index_pagination'),
|
path("<int:page>", GetHome.as_view(), name="index_pagination"),
|
||||||
path(
|
path(
|
||||||
"search",
|
"search",
|
||||||
GetHomeFiltered.as_view(http_method_names=['post']),
|
GetHomeFiltered.as_view(http_method_names=["post"]),
|
||||||
name='index_filtered'
|
name="index_filtered",
|
||||||
),
|
),
|
||||||
path("search/<str:search>",
|
path(
|
||||||
GetHomeFiltered.as_view(), name='index_filtered'),
|
"search/<str:search>", GetHomeFiltered.as_view(), name="index_filtered"
|
||||||
path("search/<str:search>/<int:page>",
|
),
|
||||||
GetHomeFiltered.as_view(), name='index_filtered_pagination'),
|
path(
|
||||||
path("<uuid:uuid>", GetRollingStock.as_view(), name='rolling_stock'),
|
"search/<str:search>/<int:page>",
|
||||||
|
GetHomeFiltered.as_view(),
|
||||||
|
name="index_filtered_pagination",
|
||||||
|
),
|
||||||
|
path("<uuid:uuid>", GetRollingStock.as_view(), name="rolling_stock"),
|
||||||
]
|
]
|
||||||
|
@@ -2,5 +2,5 @@ from django.apps import apps
|
|||||||
|
|
||||||
|
|
||||||
def get_site_conf():
|
def get_site_conf():
|
||||||
SiteConfiguration = apps.get_model('portal', 'SiteConfiguration')
|
SiteConfiguration = apps.get_model("portal", "SiteConfiguration")
|
||||||
return SiteConfiguration.get_solo()
|
return SiteConfiguration.get_solo()
|
||||||
|
@@ -24,9 +24,7 @@ class GetHome(View):
|
|||||||
except EmptyPage:
|
except EmptyPage:
|
||||||
rolling_stock = paginator.page(paginator.num_pages)
|
rolling_stock = paginator.page(paginator.num_pages)
|
||||||
|
|
||||||
return render(request, "home.html", {
|
return render(request, "home.html", {"rolling_stock": rolling_stock})
|
||||||
"rolling_stock": rolling_stock
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
class GetHomeFiltered(View):
|
class GetHomeFiltered(View):
|
||||||
@@ -37,17 +35,23 @@ class GetHomeFiltered(View):
|
|||||||
# query = {
|
# query = {
|
||||||
# _filter: _value
|
# _filter: _value
|
||||||
# }
|
# }
|
||||||
query = reduce(operator.or_, (Q(
|
query = reduce(
|
||||||
Q(rolling_class__identifier__icontains=s) |
|
operator.or_,
|
||||||
Q(rolling_class__description__icontains=s) |
|
(
|
||||||
Q(rolling_class__type__type__icontains=s) |
|
Q(
|
||||||
Q(road_number__icontains=s) |
|
Q(rolling_class__identifier__icontains=s)
|
||||||
Q(rolling_class__company__name__icontains=s) |
|
| Q(rolling_class__description__icontains=s)
|
||||||
Q(rolling_class__company__country__icontains=s) |
|
| Q(rolling_class__type__type__icontains=s)
|
||||||
Q(manufacturer__name__icontains=s) |
|
| Q(road_number__icontains=s)
|
||||||
Q(scale__scale__icontains=s) |
|
| Q(rolling_class__company__name__icontains=s)
|
||||||
Q(tags__name__icontains=s)
|
| Q(rolling_class__company__country__icontains=s)
|
||||||
) for s in search.split()))
|
| Q(manufacturer__name__icontains=s)
|
||||||
|
| Q(scale__scale__icontains=s)
|
||||||
|
| Q(tags__name__icontains=s)
|
||||||
|
)
|
||||||
|
for s in search.split()
|
||||||
|
),
|
||||||
|
)
|
||||||
rolling_stock = RollingStock.objects.filter(query)
|
rolling_stock = RollingStock.objects.filter(query)
|
||||||
paginator = Paginator(rolling_stock, site_conf.items_per_page)
|
paginator = Paginator(rolling_stock, site_conf.items_per_page)
|
||||||
|
|
||||||
@@ -63,10 +67,11 @@ class GetHomeFiltered(View):
|
|||||||
def get(self, request, search, page=1):
|
def get(self, request, search, page=1):
|
||||||
rolling_stock = self.run_search(request, search, page)
|
rolling_stock = self.run_search(request, search, page)
|
||||||
|
|
||||||
return render(request, "search.html", {
|
return render(
|
||||||
"search": search,
|
request,
|
||||||
"rolling_stock": rolling_stock
|
"search.html",
|
||||||
})
|
{"search": search, "rolling_stock": rolling_stock},
|
||||||
|
)
|
||||||
|
|
||||||
def post(self, request, page=1):
|
def post(self, request, page=1):
|
||||||
search = request.POST.get("search")
|
search = request.POST.get("search")
|
||||||
@@ -74,16 +79,21 @@ class GetHomeFiltered(View):
|
|||||||
raise Http404
|
raise Http404
|
||||||
rolling_stock = self.run_search(request, search, page)
|
rolling_stock = self.run_search(request, search, page)
|
||||||
|
|
||||||
return render(request, "search.html", {
|
return render(
|
||||||
"search": search,
|
request,
|
||||||
"rolling_stock": rolling_stock
|
"search.html",
|
||||||
})
|
{"search": search, "rolling_stock": rolling_stock},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class GetRollingStock(View):
|
class GetRollingStock(View):
|
||||||
def get(self, request, uuid):
|
def get(self, request, uuid):
|
||||||
rolling_stock = RollingStock.objects.get(uuid=uuid)
|
rolling_stock = RollingStock.objects.get(uuid=uuid)
|
||||||
|
|
||||||
return render(request, "page.html", {
|
return render(
|
||||||
|
request,
|
||||||
|
"page.html",
|
||||||
|
{
|
||||||
"rolling_stock": rolling_stock,
|
"rolling_stock": rolling_stock,
|
||||||
})
|
},
|
||||||
|
)
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
from ram.utils import git_suffix
|
from ram.utils import git_suffix
|
||||||
|
|
||||||
__version__ = '0.0.1'
|
__version__ = "0.0.1"
|
||||||
__version__ += git_suffix(__file__)
|
__version__ += git_suffix(__file__)
|
||||||
|
@@ -152,10 +152,7 @@ DECODER_INTERFACES = [
|
|||||||
(5, "Next18/Next18S"),
|
(5, "Next18/Next18S"),
|
||||||
]
|
]
|
||||||
|
|
||||||
MANUFACTURER_TYPES = [
|
MANUFACTURER_TYPES = [("model", "Model"), ("real", "Real")]
|
||||||
("model", "Model"),
|
|
||||||
("real", "Real")
|
|
||||||
]
|
|
||||||
|
|
||||||
ROLLING_STOCK_TYPES = [
|
ROLLING_STOCK_TYPES = [
|
||||||
("engine", "Engine"),
|
("engine", "Engine"),
|
||||||
|
@@ -11,13 +11,14 @@ def git_suffix(fname):
|
|||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
gh = subprocess.check_output(
|
gh = subprocess.check_output(
|
||||||
['git', 'rev-parse', '--short', 'HEAD'],
|
["git", "rev-parse", "--short", "HEAD"],
|
||||||
stderr=open(os.devnull, 'w')).strip()
|
stderr=open(os.devnull, "w"),
|
||||||
gh = "-git" + gh.decode() if gh else ''
|
).strip()
|
||||||
|
gh = "-git" + gh.decode() if gh else ""
|
||||||
except Exception:
|
except Exception:
|
||||||
# trapping everything on purpose; git may not be installed or it
|
# trapping everything on purpose; git may not be installed or it
|
||||||
# may not work properly
|
# may not work properly
|
||||||
gh = ''
|
gh = ""
|
||||||
|
|
||||||
return gh
|
return gh
|
||||||
|
|
||||||
|
@@ -2,6 +2,7 @@ import os
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
# from django.core.files.storage import FileSystemStorage
|
# from django.core.files.storage import FileSystemStorage
|
||||||
# from django.dispatch import receiver
|
# from django.dispatch import receiver
|
||||||
|
|
||||||
@@ -32,8 +33,11 @@ class RollingClass(models.Model):
|
|||||||
)
|
)
|
||||||
description = models.CharField(max_length=256, blank=True)
|
description = models.CharField(max_length=256, blank=True)
|
||||||
manufacturer = models.ForeignKey(
|
manufacturer = models.ForeignKey(
|
||||||
Manufacturer, on_delete=models.CASCADE, null=True, blank=True,
|
Manufacturer,
|
||||||
limit_choices_to={"category": "real"}
|
on_delete=models.CASCADE,
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
limit_choices_to={"category": "real"},
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
@@ -74,8 +78,11 @@ class RollingStock(models.Model):
|
|||||||
)
|
)
|
||||||
road_number = models.CharField(max_length=128, unique=False)
|
road_number = models.CharField(max_length=128, unique=False)
|
||||||
manufacturer = models.ForeignKey(
|
manufacturer = models.ForeignKey(
|
||||||
Manufacturer, on_delete=models.CASCADE, null=True, blank=True,
|
Manufacturer,
|
||||||
limit_choices_to={"category": "model"}
|
on_delete=models.CASCADE,
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
limit_choices_to={"category": "model"},
|
||||||
)
|
)
|
||||||
scale = models.ForeignKey(Scale, on_delete=models.CASCADE)
|
scale = models.ForeignKey(Scale, on_delete=models.CASCADE)
|
||||||
sku = models.CharField(max_length=32, blank=True)
|
sku = models.CharField(max_length=32, blank=True)
|
||||||
@@ -112,9 +119,7 @@ class RollingStock(models.Model):
|
|||||||
|
|
||||||
class RollingStockDocument(models.Model):
|
class RollingStockDocument(models.Model):
|
||||||
rolling_stock = models.ForeignKey(
|
rolling_stock = models.ForeignKey(
|
||||||
RollingStock,
|
RollingStock, on_delete=models.CASCADE, related_name="document"
|
||||||
on_delete=models.CASCADE,
|
|
||||||
related_name="document"
|
|
||||||
)
|
)
|
||||||
description = models.CharField(max_length=128, blank=True)
|
description = models.CharField(max_length=128, blank=True)
|
||||||
file = models.FileField(upload_to="files/", null=True, blank=True)
|
file = models.FileField(upload_to="files/", null=True, blank=True)
|
||||||
@@ -131,9 +136,7 @@ class RollingStockDocument(models.Model):
|
|||||||
|
|
||||||
class RollingStockImage(models.Model):
|
class RollingStockImage(models.Model):
|
||||||
rolling_stock = models.ForeignKey(
|
rolling_stock = models.ForeignKey(
|
||||||
RollingStock,
|
RollingStock, on_delete=models.CASCADE, related_name="image"
|
||||||
on_delete=models.CASCADE,
|
|
||||||
related_name="image"
|
|
||||||
)
|
)
|
||||||
image = models.ImageField(upload_to="images/", null=True, blank=True)
|
image = models.ImageField(upload_to="images/", null=True, blank=True)
|
||||||
is_thumbnail = models.BooleanField()
|
is_thumbnail = models.BooleanField()
|
||||||
@@ -149,7 +152,8 @@ class RollingStockImage(models.Model):
|
|||||||
def save(self, **kwargs):
|
def save(self, **kwargs):
|
||||||
if self.is_thumbnail:
|
if self.is_thumbnail:
|
||||||
RollingStockImage.objects.filter(
|
RollingStockImage.objects.filter(
|
||||||
rolling_stock=self.rolling_stock).update(is_thumbnail=False)
|
rolling_stock=self.rolling_stock
|
||||||
|
).update(is_thumbnail=False)
|
||||||
super().save(**kwargs)
|
super().save(**kwargs)
|
||||||
|
|
||||||
|
|
||||||
@@ -159,7 +163,7 @@ class RollingStockProperty(models.Model):
|
|||||||
on_delete=models.CASCADE,
|
on_delete=models.CASCADE,
|
||||||
related_name="property",
|
related_name="property",
|
||||||
null=False,
|
null=False,
|
||||||
blank=False
|
blank=False,
|
||||||
)
|
)
|
||||||
property = models.ForeignKey(Property, on_delete=models.CASCADE)
|
property = models.ForeignKey(Property, on_delete=models.CASCADE)
|
||||||
value = models.CharField(max_length=256)
|
value = models.CharField(max_length=256)
|
||||||
|
Reference in New Issue
Block a user