diff --git a/docker-compose.yml b/docker-compose.yml index 26db95d..b45a374 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,12 +1,19 @@ version: "2" services: + web: + image: docker.clkl.de/partdoc/web:0.1 + build: partdoc + env_file: postgres.env + volumes: + - ./partdoc/:/app/ + - ./sketches/:/app/sketches/ + working_dir: /app + command: python3 ./manage.py runserver 0.0.0.0:8000 + ports: + - 8080:8000 db: image: postgres:10-alpine volumes: - ./pgdata/:/var/lib/postgresql/data/ - environment: - - POSTGRES_PASSWORD=secret - - POSTGRES_USER=partdoc - ports: - - "127.0.0.1:5432:5432" \ No newline at end of file + env_file: postgres.env \ No newline at end of file diff --git a/partdoc/Dockerfile b/partdoc/Dockerfile new file mode 100644 index 0000000..50bdd2c --- /dev/null +++ b/partdoc/Dockerfile @@ -0,0 +1,6 @@ +FROM alpine:3.7 + +ADD requirements.txt / +RUN apk add --update --no-cache python3 py3-psycopg2 && \ + sed -i 's/psycopg2/#psycopg2/' /requirements.txt && \ + pip3 install -r /requirements.txt && rm /requirements.txt \ No newline at end of file diff --git a/partdoc/partdoc/settings.py b/partdoc/partdoc/settings.py index 72bd233..bd524b1 100644 --- a/partdoc/partdoc/settings.py +++ b/partdoc/partdoc/settings.py @@ -36,7 +36,7 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'django_extensions', + #'django_extensions', ] MIDDLEWARE = [ @@ -75,11 +75,11 @@ WSGI_APPLICATION = 'partdoc.wsgi.application' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', - 'NAME': 'partdoc', - 'USER': 'partdoc', - 'PASSWORD': 'secret', - 'HOST': '127.0.0.1', - 'PORT': '5432', + 'NAME': os.environ.get('POSTGRES_USER',os.environ.get('POSTGRES_DB','postgres')), + 'USER': os.environ.get('POSTGRES_USER','postgres'), + 'PASSWORD': os.environ.get('POSTGRES_PASSWORD',''), + 'HOST': os.environ.get('DB_HOST','db'), + 'PORT': os.environ.get('DB_PORT','5432'), } } @@ -121,3 +121,19 @@ STATIC_URL = '/static/' STATIC_ROOT = 'static/' DATA_UPLOAD_MAX_NUMBER_FIELDS = 10000 + +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'handlers': { + 'console': { + 'class': 'logging.StreamHandler', + }, + }, + 'loggers': { + 'django': { + 'handlers': ['console'], + 'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'), + }, + }, +} diff --git a/partdoc/parts/models.py b/partdoc/parts/models.py index 1c8370d..931ce3c 100644 --- a/partdoc/parts/models.py +++ b/partdoc/parts/models.py @@ -59,6 +59,23 @@ class Version(PartModel): def __str__(self): return "Version: " + self.name + " (" + str(self.product) + ")" + + @staticmethod + @transaction.atomic + def merge(target, rip): + self = Version.objects.filter(name=target) + other = Version.objects.filter(name=rip) + if not (self and other): + raise ValueError("invalid arguments! {} {}".format(self, other)) + self = self.first() + other = other.first() + for x in other.introduces.all(): + x.used_until = self + x.save() + for x in other.dissmisses.all(): + x.used_since = self + x.save() + other.delete() class Part(PartModel): @@ -129,8 +146,8 @@ class ProductUsage(PartModel): quantity = models.IntegerField(null=True) on_demand = models.BooleanField(default=False) obsolete = models.BooleanField(default=False) - used_until = models.ForeignKey(Version, null=True, blank=True, related_name='introduces', on_delete=models.SET_NULL) - used_since = models.ForeignKey(Version, null=True, blank=True, related_name='dissmisses', on_delete=models.SET_NULL) + used_until = models.ForeignKey(Version, null=True, blank=True, related_name='introduces', on_delete=models.SET_NULL) # TODO: switch 'introduces' and 'dismisses' + used_since = models.ForeignKey(Version, null=True, blank=True, related_name='dissmisses', on_delete=models.SET_NULL) # TODO: switch 'introduces' and 'dismisses' # replaced_by = models.ForeignKey('self', null=True, blank=True, related_name='replaces', on_delete=models.SET_NULL) replaced_by = models.CharField(max_length=512, null=True, blank=True) # alternative = models.ForeignKey('self', null=True, blank=True, related_name='alternatives', on_delete=models.SET_NULL) diff --git a/partdoc/parts/views.py b/partdoc/parts/views.py index 7d561b3..cc523af 100644 --- a/partdoc/parts/views.py +++ b/partdoc/parts/views.py @@ -111,8 +111,7 @@ def sketch_add(request, product_id, sketch_id=None): if len(note): prod.note = note if len(replaced): - # replacement, _ = ProductUsage.objects.get_or_create(product=product, usage__part__number=replaced) - # prod.replaced_by = replacement + prod.replaced_by = replaced prod.note += "{REP:" + str(replaced) + "}" # TODO internal = request.POST.getlist('internal')[i] if len(internal): diff --git a/partdoc/requirements.txt b/partdoc/requirements.txt index d7dc9da..5a39390 100644 --- a/partdoc/requirements.txt +++ b/partdoc/requirements.txt @@ -1,3 +1,2 @@ django==2.0.1 psycopg2==2.7.3.2 -django-extensions==1.9.9 diff --git a/postgres.env b/postgres.env new file mode 100644 index 0000000..4961967 --- /dev/null +++ b/postgres.env @@ -0,0 +1,4 @@ +POSTGRES_PASSWORD=secret +POSTGRES_USER=partdoc + +PYTHONUNBUFFERED=1 \ No newline at end of file