diff --git a/nextcloud/apps.py b/nextcloud/apps.py index ea1cba0..1fa1e89 100644 --- a/nextcloud/apps.py +++ b/nextcloud/apps.py @@ -1,4 +1,4 @@ - from django.apps import AppConfig +from django.apps import AppConfig class MatrixhostingConfig(AppConfig): diff --git a/requirements.txt b/requirements.txt index 8cb3640..d954546 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # Django basics -Django==3.2.4 +Django==4.0 djangorestframework django-auth-ldap fontawesome-free diff --git a/uncloud/.env-sample b/uncloud/.env-sample index 89ce721..974d307 100644 --- a/uncloud/.env-sample +++ b/uncloud/.env-sample @@ -1,10 +1,9 @@ ACTIVE_APP=nextcloud -ALLOWED_HOSTS= +ALLOWED_HOSTS='*' STRIPE_KEY= STRIPE_PUBLIC_KEY= -DATABASE_ENGINE=django.db.backends.sqlite3 -DATABASE_NAME= -DATABASE_HOST= +DATABASE_NAME=uncloud +DATABASE_HOST=localhost DATABASE_PORT= DATABASE_USER= DATABASE_PASSWORD= @@ -29,4 +28,4 @@ AUTH_LDAP_BIND_PASSWORD= LDAP_ADMIN_DN= LDAP_ADMIN_PASSWORD= LDAP_CUSTOMER_GROUP_ID= -LDAP_CUSTOMER_DN= \ No newline at end of file +LDAP_CUSTOMER_DN= diff --git a/uncloud/settings.py b/uncloud/settings.py index 0424687..5c27c45 100644 --- a/uncloud/settings.py +++ b/uncloud/settings.py @@ -42,18 +42,6 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # https://docs.djangoproject.com/en/3.0/ref/settings/#databases -DATABASES = { - 'default': { - 'ENGINE': env('DATABASE_ENGINE'), - 'NAME': env('DATABASE_NAME') if env('DATABASE_NAME') else os.path.join(BASE_DIR, 'db.sqlite3'), - 'USER': env('DATABASE_USER'), - 'PASSWORD': env('DATABASE_PASSWORD'), - 'HOST': env('DATABASE_HOST'), - 'PORT': env('DATABASE_PORT'), - } -} - - # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ @@ -73,12 +61,12 @@ INSTALLED_APPS = [ 'django.contrib.sites', 'django.contrib.staticfiles', 'django_extensions', - 'mathfilters', - 'compressor', - 'wkhtmltopdf', +# 'mathfilters', +# 'compressor', +# 'wkhtmltopdf', 'rest_framework', 'django_q', - 'notifications', +# 'notifications', 'uncloud', 'uncloud_auth', 'uncloud_net', @@ -86,13 +74,15 @@ INSTALLED_APPS = [ 'uncloud_vm', 'uncloud_service', 'opennebula', - env('ACTIVE_APP'), +# env('ACTIVE_APP'), 'uncloud_pay', # should be after the active app to load the templates from the active app first - 'allauth', - 'allauth.account', - 'allauth.socialaccount', +# 'allauth', +# 'allauth.account', +# 'allauth.socialaccount', ] +DEFAULT_AUTO_FIELD='django.db.models.AutoField' + MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', @@ -104,7 +94,7 @@ MIDDLEWARE = [ ] ROOT_URLCONF = 'uncloud.urls' -WKHTMLTOPDF_CMD = env('WKHTMLTOPDF_CMD') +#WKHTMLTOPDF_CMD = env('WKHTMLTOPDF_CMD') TEMPLATES = [ { @@ -185,14 +175,14 @@ LDAP_MAX_UID_FILE_PATH = os.environ.get('LDAP_MAX_UID_FILE_PATH', AUTHENTICATION_BACKENDS = [ "django_auth_ldap.backend.LDAPBackend", "django.contrib.auth.backends.ModelBackend", - 'allauth.account.auth_backends.AuthenticationBackend', +# 'allauth.account.auth_backends.AuthenticationBackend', ] AUTH_USER_MODEL = 'uncloud_auth.User' ACCOUNT_FORMS = { - 'signup': 'uncloud_auth.forms.MySignupForm', + 'signup': 'uncloud_auth.forms.MySignupForm', 'change_password': 'uncloud_auth.forms.MyChangePasswordForm', 'set_password': 'uncloud_auth.forms.MySetPasswordForm', 'reset_password_from_key': 'uncloud_auth.forms.MyResetPasswordKeyForm', @@ -258,7 +248,7 @@ MIN_PER_TRANSACTION = 5 # The django secret key SECRET_KEY=get_random_secret_key() -ALLOWED_HOSTS = env('ALLOWED_HOSTS') +ALLOWED_HOSTS = '' # required for hardcopy / pdf rendering: https://github.com/loftylabs/django-hardcopy CHROME_PATH = '/usr/bin/chromium-browser' diff --git a/uncloud/urls.py b/uncloud/urls.py index 1429158..64c453d 100644 --- a/uncloud/urls.py +++ b/uncloud/urls.py @@ -16,7 +16,7 @@ from rest_framework.schemas import get_schema_view from uncloud_net import views as netviews from uncloud_pay import views as payviews from uncloud_vm import views as vmviews -import notifications.urls +#import notifications.urls router = routers.DefaultRouter() @@ -56,14 +56,15 @@ urlpatterns = [ ), name='openapi-schema'), path('admin/', admin.site.urls), - path('accounts/', include('allauth.urls')), + #path('accounts/', include('allauth.urls')), path('pricing//calculate/', payviews.PricingView.as_view(), name='pricing_calculator'), path('cc/reg/', payviews.RegisterCard.as_view(), name="cc_register"), - path('inbox/notifications/', include(notifications.urls, namespace='notifications')), +# path('inbox/notifications/', include(notifications.urls, namespace='notifications')), path('payments/', include('uncloud_pay.urls', namespace='payments')), - # + # ] -if env('ACTIVE_APP') == 'nextcloud': - urlpatterns.append(path('', include('nextcloud.urls', namespace='nextcloud'))) -elif env('ACTIVE_APP') == 'matrixhosting': - urlpatterns.append(path('', include('matrixhosting.urls', namespace='matrix'))) \ No newline at end of file + +# if env('ACTIVE_APP') == 'nextcloud': +# urlpatterns.append(path('', include('nextcloud.urls', namespace='nextcloud'))) +# elif env('ACTIVE_APP') == 'matrixhosting': +# urlpatterns.append(path('', include('matrixhosting.urls', namespace='matrix'))) diff --git a/uncloud_auth/forms.py b/uncloud_auth/forms.py index 11ec9c0..8ac05e8 100644 --- a/uncloud_auth/forms.py +++ b/uncloud_auth/forms.py @@ -1,6 +1,6 @@ import logging -from allauth.account.forms import SignupForm, ChangePasswordForm, ResetPasswordKeyForm, SetPasswordForm +#from allauth.account.forms import SignupForm, ChangePasswordForm, ResetPasswordKeyForm, SetPasswordForm from django import forms as d_forms from django.conf import settings from django.utils.translation import gettext_lazy as _ diff --git a/uncloud_pay/admin.py b/uncloud_pay/admin.py index 7904b27..2b07400 100644 --- a/uncloud_pay/admin.py +++ b/uncloud_pay/admin.py @@ -2,7 +2,6 @@ from django.contrib import admin from django.template.response import TemplateResponse from django.urls import path from django.shortcuts import render -from django.conf.urls import url from hardcopy import bytestring_to_pdf from django.core.files.temp import NamedTemporaryFile @@ -20,72 +19,72 @@ class RecurringPeriodInline(admin.TabularInline): class ProductAdmin(admin.ModelAdmin): inlines = [ RecurringPeriodInline ] -class BillAdmin(admin.ModelAdmin): - inlines = [ BillRecordInline ] +# class BillAdmin(admin.ModelAdmin): +# inlines = [ BillRecordInline ] - def get_urls(self): - """ - Create URLs for PDF view - """ +# def get_urls(self): +# """ +# Create URLs for PDF view +# """ - info = "%s_%s" % (self.model._meta.app_label, self.model._meta.model_name) - pat = lambda regex, fn: url(regex, self.admin_site.admin_view(fn), name='%s_%s' % (info, fn.__name__)) +# info = "%s_%s" % (self.model._meta.app_label, self.model._meta.model_name) +# pat = lambda regex, fn: url(regex, self.admin_site.admin_view(fn), name='%s_%s' % (info, fn.__name__)) - url_patterns = [ - pat(r'^([0-9]+)/as_pdf/$', self.as_pdf), - pat(r'^([0-9]+)/as_html/$', self.as_html), - ] + super().get_urls() +# url_patterns = [ +# pat(r'^([0-9]+)/as_pdf/$', self.as_pdf), +# pat(r'^([0-9]+)/as_html/$', self.as_html), +# ] + super().get_urls() - return url_patterns +# return url_patterns - def as_pdf(self, request, object_id): - bill = self.get_object(request, object_id=object_id) - print(bill) +# def as_pdf(self, request, object_id): +# bill = self.get_object(request, object_id=object_id) +# print(bill) - if bill is None: - raise self._get_404_exception(object_id) +# if bill is None: +# raise self._get_404_exception(object_id) - output_file = NamedTemporaryFile() - bill_html = render_to_string( - "uncloud_pay/bill.html.j2", - { - 'bill': bill, - 'bill_records': bill.bill_records.all() - } - ) +# output_file = NamedTemporaryFile() +# bill_html = render_to_string( +# "uncloud_pay/bill.html.j2", +# { +# 'bill': bill, +# 'bill_records': bill.bill_records.all() +# } +# ) - bytestring_to_pdf(bill_html.encode('utf-8'), output_file) - response = FileResponse(output_file, content_type="application/pdf") - response['Content-Disposition'] = f'filename="bill_{bill}.pdf"' +# bytestring_to_pdf(bill_html.encode('utf-8'), output_file) +# response = FileResponse(output_file, content_type="application/pdf") +# response['Content-Disposition'] = f'filename="bill_{bill}.pdf"' - return response +# return response - def as_html(self, request, object_id): - bill = self.get_object(request, object_id=object_id) +# def as_html(self, request, object_id): +# bill = self.get_object(request, object_id=object_id) - if bill is None: - raise self._get_404_exception(object_id) +# if bill is None: +# raise self._get_404_exception(object_id) - return render(request, 'uncloud_pay/bill.html.j2', - {'bill': bill, - 'bill_records': bill.bill_records.all() - }) +# return render(request, 'uncloud_pay/bill.html.j2', +# {'bill': bill, +# 'bill_records': bill.bill_records.all() +# }) - bill_html = render_to_string("bill.html.j2", {'bill': bill, - 'bill_records': bill.bill_records.all() - }) +# bill_html = render_to_string("bill.html.j2", {'bill': bill, +# 'bill_records': bill.bill_records.all() +# }) - bytestring_to_pdf(bill_html.encode('utf-8'), output_file) - response = FileResponse(output_file, content_type="application/pdf") +# bytestring_to_pdf(bill_html.encode('utf-8'), output_file) +# response = FileResponse(output_file, content_type="application/pdf") - response['Content-Disposition'] = f'filename="bill_{bill}.pdf"' +# response['Content-Disposition'] = f'filename="bill_{bill}.pdf"' - return HttpResponse(template.render(context, request)) - return response +# return HttpResponse(template.render(context, request)) +# return response -admin.site.register(Bill, BillAdmin) +#admin.site.register(Bill, BillAdmin) admin.site.register(Product, ProductAdmin) for m in [ diff --git a/uncloud_pay/views.py b/uncloud_pay/views.py index f9811ab..d880857 100644 --- a/uncloud_pay/views.py +++ b/uncloud_pay/views.py @@ -18,7 +18,7 @@ from django.core.files.temp import NamedTemporaryFile from django.views.generic.list import ListView from django.http import FileResponse, HttpResponseRedirect from django.template.loader import render_to_string -from wkhtmltopdf.views import PDFTemplateResponse +#from wkhtmltopdf.views import PDFTemplateResponse from copy import deepcopy import json @@ -35,7 +35,7 @@ import uncloud_pay.stripe as uncloud_stripe from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator from django.http import JsonResponse -import stripe +import stripe logger = logging.getLogger(__name__) @@ -47,14 +47,14 @@ class PricingView(View): address = False selected_country = request.GET.get('country', False) if self.request.user and self.request.user.is_authenticated: - address = get_billing_address_for_user(self.request.user) + address = get_billing_address_for_user(self.request.user) if address and (address.country == selected_country or not selected_country): vat_rate = VATRate.get_vat_rate(address) vat_validation_status = "verified" if address.vat_number_validated_on and address.vat_number_verified else False elif selected_country: vat_rate = VATRate.get_vat_rate_for_country(selected_country) vat_validation_status = False - + pricing = get_order_total_with_vat( request.GET.get('cores'), request.GET.get('memory'), @@ -104,13 +104,13 @@ class OrderSuccessView(DetailView): @cache_control(no_cache=True, must_revalidate=True, no_store=True) def get(self, request, *args, **kwargs): if ('order' not in request.session or ('bill_id' not in request.session)): - return HttpResponseRedirect(reverse('nextcloud:index')) + return HttpResponseRedirect(reverse('nextcloud:index')) context = { 'order': self.request.session.get('order'), 'bill_id': self.request.session['bill_id'], - 'balance': get_balance_for_user(self.request.user) + 'balance': get_balance_for_user(self.request.user) } - return render(request, self.template_name, context) + return render(request, self.template_name, context) class InvoiceDownloadView(View): template = 'uncloud_pay/invoice.html' diff --git a/uncloud_v3/Dockerfile b/uncloud_v3/Dockerfile new file mode 100644 index 0000000..c953d76 --- /dev/null +++ b/uncloud_v3/Dockerfile @@ -0,0 +1,30 @@ +# Currently not working due do ldap: +# +# /usr/lib/gcc/x86_64-alpine-linux-musl/10.3.1/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lldap_r +# +# While trying to install python-ldap + +FROM python:3.10.0-alpine3.15 + +WORKDIR /usr/src/app + +# FIX https://github.com/python-ldap/python-ldap/issues/432 +RUN echo 'INPUT ( libldap.so )' > /usr/lib/libldap_r.so + +COPY requirements.txt ./ +# OS requirements for building wheel and for operating uncloud +RUN apk update && apk add \ + gcc \ + git \ + libxml2-dev \ + libxslt-dev \ + libffi-dev \ + openldap-dev \ + postgresql-dev \ + python3-dev \ + musl-dev \ + nginx \ + wireguard-tools-wg +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . diff --git a/uncloud_v3/build.sh b/uncloud_v3/build.sh new file mode 100755 index 0000000..1e7f492 --- /dev/null +++ b/uncloud_v3/build.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +set -x + +name=uncloud:$(git describe) +docker build -t ${name} . + +# check for args +if [ $# -ge 1 ]; then + target=$1; shift +else + target="" +fi + +case "$target" in + dev) + url=harbor.default.svc.c2.k8s.ooo/ungleich-public + docker tag $name ${url}/${name} + docker push ${url}/${name} + ;; + prod) + url=harbor.ungleich.svc.p10.k8s.ooo/ungleich-public + docker tag $name ${url}/${name} + docker push ${url}/${name} + ;; + "") + echo "Not pushing anywhere" + ;; + *) + echo "Unknown argument $target, ignoring" + exit 1 + ;; +esac