Merge remote-tracking branch 'ahmed/master'
This commit is contained in:
commit
2900844f63
17 changed files with 841 additions and 20 deletions
55
abk-hacks.py
Normal file
55
abk-hacks.py
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
"""
|
||||||
|
investigate into a simple python function that maps an ldap user to a vat percentage. Basically you need to
|
||||||
|
lookup the customer address, check if she is a business/registered tax number and if not apply the local
|
||||||
|
vat
|
||||||
|
"""
|
||||||
|
|
||||||
|
import iso3166
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
from csv import DictReader
|
||||||
|
|
||||||
|
|
||||||
|
def get_vat(street_address, city, postal_code, country, vat_number=None):
|
||||||
|
vat = {
|
||||||
|
'Austria': [
|
||||||
|
{'period': '1984-01-01/', 'rate': 0.2},
|
||||||
|
{'period': '1976-01-01/1984-01-01', 'rate': 0.18},
|
||||||
|
{'period': '1973-01-01/1976-01-01', 'rate': 0.16},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
return iso3166.countries.get(country)
|
||||||
|
|
||||||
|
# return iso3166.countries_by_name[country]
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# vat = get_vat(
|
||||||
|
# street_address='82 Nasheman-e-Iqbal near Wapda Town',
|
||||||
|
# city='Lahore',
|
||||||
|
# postal_code=53700,
|
||||||
|
# country='Pakistan',
|
||||||
|
# )
|
||||||
|
# print(vat)
|
||||||
|
vat_rates = {}
|
||||||
|
with open('vat_rates.csv', newline='') as csvfile:
|
||||||
|
reader = DictReader(csvfile)
|
||||||
|
for row in reader:
|
||||||
|
territory_codes = row['territory_codes'].split('\n')
|
||||||
|
for code in territory_codes:
|
||||||
|
if code not in vat_rates:
|
||||||
|
vat_rates[code] = {}
|
||||||
|
|
||||||
|
start_date = row['start_date']
|
||||||
|
stop_data = row['stop_date']
|
||||||
|
time_period = f'{start_date}|{stop_data}'
|
||||||
|
r = row.copy()
|
||||||
|
del r['start_date']
|
||||||
|
del r['stop_date']
|
||||||
|
del r['territory_codes']
|
||||||
|
vat_rates[code][time_period] = r
|
||||||
|
print(vat_rates)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
46
abkhack/opennebula_hacks.py
Normal file
46
abkhack/opennebula_hacks.py
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
import importlib
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
from os.path import join as join_path
|
||||||
|
from xmlrpc.client import ServerProxy as RPCClient
|
||||||
|
|
||||||
|
root = os.path.dirname(os.getcwd())
|
||||||
|
sys.path.append(join_path(root, 'uncloud'))
|
||||||
|
secrets = importlib.import_module('uncloud.secrets')
|
||||||
|
|
||||||
|
|
||||||
|
class OpenNebula:
|
||||||
|
def __init__(self, url, session_string):
|
||||||
|
self.session_string = session_string
|
||||||
|
self.client = RPCClient(secrets.OPENNEBULA_URL)
|
||||||
|
|
||||||
|
def create_user(self, username, password, authentication_driver='', group_id=None):
|
||||||
|
# https://docs.opennebula.org/5.10/integration/system_interfaces/api.html#one-user-allocate
|
||||||
|
|
||||||
|
if group_id is None:
|
||||||
|
group_id = []
|
||||||
|
|
||||||
|
return self.client.one.user.allocate(
|
||||||
|
self.session_string,
|
||||||
|
username,
|
||||||
|
password,
|
||||||
|
authentication_driver,
|
||||||
|
group_id
|
||||||
|
)
|
||||||
|
|
||||||
|
def chmod(self, vm_id, user_id=-1, group_id=-1):
|
||||||
|
# https://docs.opennebula.org/5.10/integration/system_interfaces/api.html#one-vm-chown
|
||||||
|
|
||||||
|
return self.client.one.vm.chown(self.session_string, vm_id, user_id, group_id)
|
||||||
|
|
||||||
|
|
||||||
|
one = OpenNebula(secrets.OPENNEBULA_URL, secrets.OPENNEBULA_USER_PASS)
|
||||||
|
|
||||||
|
# Create User in OpenNebula
|
||||||
|
# success, response, *_ = one.create_user(username='meow12345', password='hello_world')
|
||||||
|
# print(success, response)
|
||||||
|
|
||||||
|
# Change owner of a VM
|
||||||
|
# success, response, *_ = one.chmod(vm_id=25589, user_id=706)
|
||||||
|
# print(success, response)
|
|
@ -1,7 +1,3 @@
|
||||||
xmltodict
|
|
||||||
djangorestframework
|
|
||||||
django
|
|
||||||
done
|
|
||||||
stripe
|
stripe
|
||||||
flask
|
flask
|
||||||
Flask-RESTful
|
Flask-RESTful
|
||||||
|
|
11
nicohack202002/uncloud/opennebula/models.py
Normal file
11
nicohack202002/uncloud/opennebula/models.py
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
from django.db import models
|
||||||
|
from django.contrib.auth import get_user_model
|
||||||
|
|
||||||
|
|
||||||
|
class VM(models.Model):
|
||||||
|
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||||
|
vmid = models.IntegerField()
|
||||||
|
owner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
|
||||||
|
data = models.CharField(max_length=65536, null=True)
|
59
nicohack202002/uncloud/opennebula/views.py
Normal file
59
nicohack202002/uncloud/opennebula/views.py
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
import json
|
||||||
|
|
||||||
|
from rest_framework import generics
|
||||||
|
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
|
||||||
|
from rest_framework.permissions import IsAuthenticated, IsAdminUser
|
||||||
|
|
||||||
|
from .models import VM
|
||||||
|
from .serializers import VMSerializer
|
||||||
|
|
||||||
|
class VMList(generics.ListAPIView):
|
||||||
|
authentication_classes = [SessionAuthentication, BasicAuthentication]
|
||||||
|
permission_classes = [IsAuthenticated, IsAdminUser]
|
||||||
|
queryset = VM.objects.all()
|
||||||
|
serializer_class = VMSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class VMDetail(generics.RetrieveAPIView):
|
||||||
|
authentication_classes = [SessionAuthentication, BasicAuthentication]
|
||||||
|
permission_classes = [IsAuthenticated, IsAdminUser]
|
||||||
|
lookup_field = 'uuid'
|
||||||
|
queryset = VM.objects.all()
|
||||||
|
serializer_class = VMSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class UserVMList(generics.ListAPIView):
|
||||||
|
authentication_classes = [SessionAuthentication, BasicAuthentication]
|
||||||
|
permission_classes = [IsAuthenticated]
|
||||||
|
serializer_class = VMSerializer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
user_email = self.request.user.ldap_user.attrs.data['mail']
|
||||||
|
vms = []
|
||||||
|
for mail in user_email:
|
||||||
|
vms += VM.objects.filter(owner__username=mail)
|
||||||
|
|
||||||
|
for vm in vms:
|
||||||
|
data = json.loads(vm.data)
|
||||||
|
vm_template = data['TEMPLATE']
|
||||||
|
vm.data = {
|
||||||
|
'cpu': vm_template['VCPU'],
|
||||||
|
'ram': vm_template['MEMORY'],
|
||||||
|
'nic': vm_template['NIC'],
|
||||||
|
'disks': vm_template['DISK']
|
||||||
|
}
|
||||||
|
|
||||||
|
return vms
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Following for quick experimentation #
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
# from django.http import HttpResponse
|
||||||
|
#
|
||||||
|
# def test(request):
|
||||||
|
# user_email = request.user.ldap_user.attrs.data['mail']
|
||||||
|
# vms = []
|
||||||
|
# for mail in user_email:
|
||||||
|
# vms += VM.objects.filter(owner__username=mail)
|
||||||
|
# return HttpResponse("Hello World")
|
125
nicohack202002/uncloud/uncloud_api/models.py
Normal file
125
nicohack202002/uncloud/uncloud_api/models.py
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
from django.db import models
|
||||||
|
from django.contrib.auth import get_user_model
|
||||||
|
|
||||||
|
# Product in DB vs. product in code
|
||||||
|
# DB:
|
||||||
|
# - need to define params (+param types) in db -> messy?
|
||||||
|
# - get /products/ is easy / automatic
|
||||||
|
#
|
||||||
|
# code
|
||||||
|
# - can have serializer/verification of fields easily in DRF
|
||||||
|
# - can have per product side effects / extra code running
|
||||||
|
# - might (??) make features easier??
|
||||||
|
# - how to setup / query the recurring period (?)
|
||||||
|
# - could get products list via getattr() + re ...Product() classes
|
||||||
|
# -> this could include the url for ordering => /order/vm_snapshot (params)
|
||||||
|
# ---> this would work with urlpatterns
|
||||||
|
|
||||||
|
# Combination: create specific product in DB (?)
|
||||||
|
# - a table per product (?) with 1 entry?
|
||||||
|
|
||||||
|
# Orders
|
||||||
|
# define state in DB
|
||||||
|
# select a price from a product => product might change, order stays
|
||||||
|
# params:
|
||||||
|
# - the product uuid or name (?) => productuuid
|
||||||
|
# - the product parameters => for each feature
|
||||||
|
#
|
||||||
|
|
||||||
|
# logs
|
||||||
|
# Should have a log = ... => 1:n field for most models!
|
||||||
|
|
||||||
|
|
||||||
|
class Product(models.Model):
|
||||||
|
# override these fields by default
|
||||||
|
description = ""
|
||||||
|
recurring_period = "not_recurring"
|
||||||
|
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||||
|
status = models.CharField(
|
||||||
|
max_length=256, choices=(
|
||||||
|
('pending', 'Pending'),
|
||||||
|
('being_created', 'Being created'),
|
||||||
|
('created_active', 'Created'),
|
||||||
|
('deleted', 'Deleted')
|
||||||
|
),
|
||||||
|
default='pending'
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "{}".format(self.name)
|
||||||
|
|
||||||
|
|
||||||
|
class VMSnapshotProduct(Product):
|
||||||
|
price_per_gb_ssd = 0.35
|
||||||
|
price_per_gb_hdd = 1.5/100
|
||||||
|
|
||||||
|
sample_ssd = 10
|
||||||
|
sample_hdd = 100
|
||||||
|
|
||||||
|
def recurring_price(self):
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def one_time_price(self):
|
||||||
|
return 0
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def sample_price(cls):
|
||||||
|
return cls.sample_ssd * cls.price_per_gb_ssd + cls.sample_hdd * cls.price_per_gb_hdd
|
||||||
|
|
||||||
|
description = "Create snapshot of a VM"
|
||||||
|
recurring_period = "monthly"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def pricing_model(cls):
|
||||||
|
return """
|
||||||
|
Pricing is on monthly basis and storage prices are equivalent to the storage
|
||||||
|
price in the VM.
|
||||||
|
|
||||||
|
Price per GB SSD is: {}
|
||||||
|
Price per GB HDD is: {}
|
||||||
|
|
||||||
|
|
||||||
|
Sample price for a VM with {} GB SSD and {} GB HDD VM is: {}.
|
||||||
|
""".format(cls.price_per_gb_ssd, cls.price_per_gb_hdd,
|
||||||
|
cls.sample_ssd, cls.sample_hdd, cls.sample_price())
|
||||||
|
|
||||||
|
gb_ssd = models.FloatField()
|
||||||
|
gb_hdd = models.FloatField()
|
||||||
|
|
||||||
|
|
||||||
|
class Feature(models.Model):
|
||||||
|
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||||
|
name = models.CharField(max_length=256)
|
||||||
|
|
||||||
|
recurring_price = models.FloatField(default=0)
|
||||||
|
one_time_price = models.FloatField()
|
||||||
|
|
||||||
|
product = models.ForeignKey(Product, on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
# params for "cpu": cpu_count -> int
|
||||||
|
# each feature can only have one parameters
|
||||||
|
# could call this "value" and set whether it is user usable
|
||||||
|
# has_value = True/False
|
||||||
|
# value = string -> int (?)
|
||||||
|
# value_int
|
||||||
|
# value_str
|
||||||
|
# value_float
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "'{}' - '{}'".format(self.product, self.name)
|
||||||
|
|
||||||
|
|
||||||
|
class Order(models.Model):
|
||||||
|
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||||
|
|
||||||
|
owner = models.ForeignKey(get_user_model(),
|
||||||
|
on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
product = models.ForeignKey(Product,
|
||||||
|
on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
|
||||||
|
class VMSnapshotOrder(Order):
|
||||||
|
pass
|
83
nicohack202002/uncloud/uncloud_api/views.py
Normal file
83
nicohack202002/uncloud/uncloud_api/views.py
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
from django.shortcuts import render
|
||||||
|
from django.contrib.auth import get_user_model
|
||||||
|
from django.contrib.auth.models import Group
|
||||||
|
|
||||||
|
from rest_framework import viewsets, permissions, generics
|
||||||
|
from .serializers import UserSerializer, GroupSerializer
|
||||||
|
from rest_framework.views import APIView
|
||||||
|
from rest_framework.response import Response
|
||||||
|
|
||||||
|
|
||||||
|
class CreditCardViewSet(viewsets.ModelViewSet):
|
||||||
|
|
||||||
|
"""
|
||||||
|
API endpoint that allows credit cards to be listed
|
||||||
|
"""
|
||||||
|
queryset = get_user_model().objects.all().order_by('-date_joined')
|
||||||
|
serializer_class = UserSerializer
|
||||||
|
|
||||||
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
|
|
||||||
|
|
||||||
|
class UserViewSet(viewsets.ModelViewSet):
|
||||||
|
|
||||||
|
"""
|
||||||
|
API endpoint that allows users to be viewed or edited.
|
||||||
|
"""
|
||||||
|
queryset = get_user_model().objects.all().order_by('-date_joined')
|
||||||
|
serializer_class = UserSerializer
|
||||||
|
|
||||||
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
|
|
||||||
|
class GroupViewSet(viewsets.ModelViewSet):
|
||||||
|
"""
|
||||||
|
API endpoint that allows groups to be viewed or edited.
|
||||||
|
"""
|
||||||
|
queryset = Group.objects.all()
|
||||||
|
serializer_class = GroupSerializer
|
||||||
|
|
||||||
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
|
|
||||||
|
class GroupViewSet(viewsets.ModelViewSet):
|
||||||
|
"""
|
||||||
|
API endpoint that allows groups to be viewed or edited.
|
||||||
|
"""
|
||||||
|
queryset = Group.objects.all()
|
||||||
|
serializer_class = GroupSerializer
|
||||||
|
|
||||||
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
|
|
||||||
|
|
||||||
|
# POST /vm/snapshot/ vmuuid=... => create snapshot, returns snapshot uuid
|
||||||
|
# GET /vm/snapshot => list
|
||||||
|
# DEL /vm/snapshot/<uuid:uuid> => delete
|
||||||
|
# create-list -> get, post => ListCreateAPIView
|
||||||
|
# del on other!
|
||||||
|
class VMSnapshotView(generics.ListCreateAPIView):
|
||||||
|
#lookup_field = 'uuid'
|
||||||
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
|
|
||||||
|
import inspect
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
|
||||||
|
# Next: create /order/<productname> urls
|
||||||
|
# Next: strip off "Product" at the end
|
||||||
|
class ProductsView(APIView):
|
||||||
|
def get(self, request, format=None):
|
||||||
|
clsmembers = inspect.getmembers(sys.modules['uncloud_api.models'], inspect.isclass)
|
||||||
|
products = []
|
||||||
|
for name, c in clsmembers:
|
||||||
|
# Include everything that ends in Product, but not Product itself
|
||||||
|
m = re.match(r'(?P<pname>.+)Product$', name)
|
||||||
|
if m:
|
||||||
|
products.append({
|
||||||
|
'name': m.group('pname'),
|
||||||
|
'description': c.description,
|
||||||
|
'recurring_period': c.recurring_period,
|
||||||
|
'pricing_model': c.pricing_model()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
return Response(products)
|
11
notes-abk.md
Normal file
11
notes-abk.md
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
## TODO 2020-02-22
|
||||||
|
|
||||||
|
* ~~move the current rest api to /opennebula~~
|
||||||
|
* ~~make the /opennebula api only accessible by an admin account~~
|
||||||
|
* ~~create a new filtered api on /vm/list that~~
|
||||||
|
* ~~a) requires authentication~~
|
||||||
|
* ~~b) only shows the VMs of the current user~~
|
||||||
|
* ~~the new api should not contain all details, but: cpus (as read by the vcpu field), ram, ips, disks~~
|
||||||
|
* ~~also make a (random) uuid the primary key for VMs - everything in this uncloud hack will use uuids as the id~~
|
||||||
|
* ~~still expose the opennebula id as opennebula_id~~
|
||||||
|
* ~~note put all secrets/configs into uncloud.secrets - I added a sample file into the repo~~
|
6
plan.org
Normal file
6
plan.org
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
* TODO register CC
|
||||||
|
* TODO list products
|
||||||
|
* ahmed
|
||||||
|
** schemas
|
||||||
|
*** field: is_valid? - used by schemas
|
||||||
|
*** definition of a "schema"
|
2
uncloud/.gitignore
vendored
2
uncloud/.gitignore
vendored
|
@ -1 +1,3 @@
|
||||||
db.sqlite3
|
db.sqlite3
|
||||||
|
uncloud/secrets.py
|
||||||
|
debug.log
|
23
uncloud/opennebula/migrations/0004_auto_20200222_0713.py
Normal file
23
uncloud/opennebula/migrations/0004_auto_20200222_0713.py
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# Generated by Django 3.0.3 on 2020-02-22 07:13
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('opennebula', '0003_auto_20200221_1113'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='vm',
|
||||||
|
name='id',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='vm',
|
||||||
|
name='uuid',
|
||||||
|
field=models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False),
|
||||||
|
),
|
||||||
|
]
|
|
@ -3,4 +3,3 @@ djangorestframework
|
||||||
django-auth-ldap
|
django-auth-ldap
|
||||||
stripe
|
stripe
|
||||||
xmltodict
|
xmltodict
|
||||||
psycopg2
|
|
||||||
|
|
|
@ -1,15 +1,14 @@
|
||||||
# Live/test key from stripe
|
# Live/test key from stripe
|
||||||
STRIPE_KEY=""
|
STRIPE_KEY = ''
|
||||||
|
|
||||||
# XML-RPC interface of opennebula
|
# XML-RPC interface of opennebula
|
||||||
OPENNEBULA_URL='https://opennebula.ungleich.ch:2634/RPC2'
|
OPENNEBULA_URL = 'https://opennebula.ungleich.ch:2634/RPC2'
|
||||||
|
|
||||||
# user:pass for accessing opennebula
|
# user:pass for accessing opennebula
|
||||||
OPENNEBULA_USER_PASS='user:password'
|
OPENNEBULA_USER_PASS = 'user:password'
|
||||||
|
|
||||||
POSTGRESQL_DB_NAME="uncloud"
|
POSTGRESQL_DB_NAME="uncloud"
|
||||||
|
|
||||||
|
|
||||||
# See https://django-auth-ldap.readthedocs.io/en/latest/authentication.html
|
# See https://django-auth-ldap.readthedocs.io/en/latest/authentication.html
|
||||||
LDAP_ADMIN_DN=""
|
LDAP_ADMIN_DN=""
|
||||||
LDAP_ADMIN_PASSWORD=""
|
LDAP_ADMIN_PASSWORD=""
|
||||||
|
|
|
@ -12,9 +12,19 @@ https://docs.djangoproject.com/en/3.0/ref/settings/
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
|
||||||
# Uncommitted file with secrets
|
# Uncommitted file with secrets
|
||||||
import uncloud.secrets
|
import uncloud.secrets
|
||||||
|
|
||||||
|
import stripe
|
||||||
|
import ldap
|
||||||
|
|
||||||
|
import uncloud.secrets as secrets
|
||||||
|
|
||||||
|
from django_auth_ldap.config import LDAPSearch
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
@ -101,10 +111,14 @@ AUTH_PASSWORD_VALIDATORS = [
|
||||||
################################################################################
|
################################################################################
|
||||||
# AUTH/LDAP
|
# AUTH/LDAP
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
import ldap
|
import ldap
|
||||||
from django_auth_ldap.config import LDAPSearch
|
from django_auth_ldap.config import LDAPSearch
|
||||||
|
|
||||||
AUTH_LDAP_SERVER_URI = uncloud.secrets.LDAP_SERVER_URI
|
AUTH_LDAP_SERVER_URI = uncloud.secrets.LDAP_SERVER_URI
|
||||||
|
=======
|
||||||
|
AUTH_LDAP_SERVER_URI = "ldaps://ldap1.ungleich.ch,ldaps://ldap2.ungleich.ch"
|
||||||
|
>>>>>>> ahmed/master
|
||||||
|
|
||||||
AUTH_LDAP_USER_ATTR_MAP = {
|
AUTH_LDAP_USER_ATTR_MAP = {
|
||||||
"first_name": "givenName",
|
"first_name": "givenName",
|
||||||
|
@ -112,8 +126,15 @@ AUTH_LDAP_USER_ATTR_MAP = {
|
||||||
"email": "mail"
|
"email": "mail"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
AUTH_LDAP_BIND_DN = uncloud.secrets.LDAP_ADMIN_DN
|
AUTH_LDAP_BIND_DN = uncloud.secrets.LDAP_ADMIN_DN
|
||||||
AUTH_LDAP_BIND_PASSWORD = uncloud.secrets.LDAP_ADMIN_PASSWORD
|
AUTH_LDAP_BIND_PASSWORD = uncloud.secrets.LDAP_ADMIN_PASSWORD
|
||||||
|
=======
|
||||||
|
AUTH_LDAP_BIND_DN = secrets.AUTH_LDAP_BIND_DN
|
||||||
|
|
||||||
|
AUTH_LDAP_BIND_PASSWORD = secrets.AUTH_LDAP_BIND_PASSWORD
|
||||||
|
|
||||||
|
>>>>>>> ahmed/master
|
||||||
AUTH_LDAP_USER_SEARCH = LDAPSearch(
|
AUTH_LDAP_USER_SEARCH = LDAPSearch(
|
||||||
"dc=ungleich,dc=ch", ldap.SCOPE_SUBTREE, "(uid=%(user)s)"
|
"dc=ungleich,dc=ch", ldap.SCOPE_SUBTREE, "(uid=%(user)s)"
|
||||||
)
|
)
|
||||||
|
@ -133,7 +154,6 @@ AUTH_USER_MODEL = 'uncloud_auth.User'
|
||||||
# AUTH/REST
|
# AUTH/REST
|
||||||
REST_FRAMEWORK = {
|
REST_FRAMEWORK = {
|
||||||
'DEFAULT_AUTHENTICATION_CLASSES': [
|
'DEFAULT_AUTHENTICATION_CLASSES': [
|
||||||
'rest_framework.authentication.BasicAuthentication',
|
|
||||||
'rest_framework.authentication.SessionAuthentication',
|
'rest_framework.authentication.SessionAuthentication',
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -159,12 +179,34 @@ USE_TZ = True
|
||||||
|
|
||||||
STATIC_URL = '/static/'
|
STATIC_URL = '/static/'
|
||||||
|
|
||||||
|
stripe.api_key = secrets.STRIPE_KEY
|
||||||
|
|
||||||
|
# FIXME: not sure if we really need this
|
||||||
|
LOGGING = {
|
||||||
|
'version': 1,
|
||||||
|
'disable_existing_loggers': False,
|
||||||
|
'handlers': {
|
||||||
|
'file': {
|
||||||
|
'level': 'DEBUG',
|
||||||
|
'class': 'logging.FileHandler',
|
||||||
|
'filename': 'debug.log',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'loggers': {
|
||||||
|
'django': {
|
||||||
|
'handlers': ['file'],
|
||||||
|
'level': 'DEBUG',
|
||||||
|
'propagate': True,
|
||||||
|
},
|
||||||
|
'django_auth_ldap': {
|
||||||
|
'handlers': ['file'],
|
||||||
|
'level': 'DEBUG',
|
||||||
|
'propagate': True
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# Database
|
|
||||||
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
|
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
|
||||||
|
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
'default': {
|
'default': {
|
||||||
'ENGINE': 'django.db.backends.postgresql',
|
'ENGINE': 'django.db.backends.postgresql',
|
||||||
|
|
|
@ -16,13 +16,6 @@ class Command(BaseCommand):
|
||||||
print("Snapshotting")
|
print("Snapshotting")
|
||||||
#getattr(self, options['command'])(**options)
|
#getattr(self, options['command'])(**options)
|
||||||
|
|
||||||
|
|
||||||
def get_disks_of_vm(self, vmuuid):
|
|
||||||
""" Returns the disks used by a VM in the format
|
|
||||||
( ceph_name, size )
|
|
||||||
"""
|
|
||||||
pass
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def monitor(cls, **_):
|
def monitor(cls, **_):
|
||||||
while True:
|
while True:
|
||||||
|
|
46
uncloud/uncloud_api/migrations/0002_auto_20200222_0719.py
Normal file
46
uncloud/uncloud_api/migrations/0002_auto_20200222_0719.py
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
# Generated by Django 3.0.3 on 2020-02-22 07:19
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('uncloud_api', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='VMSnapshotOrder',
|
||||||
|
fields=[
|
||||||
|
('order_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='uncloud_api.Order')),
|
||||||
|
],
|
||||||
|
bases=('uncloud_api.order',),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='VMSnapshotProduct',
|
||||||
|
fields=[
|
||||||
|
('product_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='uncloud_api.Product')),
|
||||||
|
('gb_ssd', models.FloatField()),
|
||||||
|
('gb_hdd', models.FloatField()),
|
||||||
|
],
|
||||||
|
bases=('uncloud_api.product',),
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='OrderReference',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='product',
|
||||||
|
name='name',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='product',
|
||||||
|
name='recurring_period',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='product',
|
||||||
|
name='status',
|
||||||
|
field=models.CharField(choices=[('pending', 'Pending'), ('being_created', 'Being created'), ('created_active', 'Created'), ('deleted', 'Deleted')], default='pending', max_length=256),
|
||||||
|
),
|
||||||
|
]
|
325
vat_rates.csv
Normal file
325
vat_rates.csv
Normal file
|
@ -0,0 +1,325 @@
|
||||||
|
start_date,stop_date,territory_codes,currency_code,rate,rate_type,description
|
||||||
|
2011-01-04,,AI,XCD,0,standard,Anguilla (British overseas territory) is exempted of VAT.
|
||||||
|
1984-01-01,,AT,EUR,0.2,standard,Austria (member state) standard VAT rate.
|
||||||
|
1976-01-01,1984-01-01,AT,EUR,0.18,standard,
|
||||||
|
1973-01-01,1976-01-01,AT,EUR,0.16,standard,
|
||||||
|
1984-01-01,,"AT-6691
|
||||||
|
DE-87491",EUR,0.19,standard,Jungholz (Austrian town) special VAT rate.
|
||||||
|
1984-01-01,,"AT-6991
|
||||||
|
AT-6992
|
||||||
|
AT-6993
|
||||||
|
DE-87567
|
||||||
|
DE-87568
|
||||||
|
DE-87569",EUR,0.19,standard,Mittelberg (Austrian town) special VAT rate.
|
||||||
|
1996-01-01,,BE,EUR,0.21,standard,Belgium (member state) standard VAT rate.
|
||||||
|
1994-01-01,1996-01-01,BE,EUR,0.205,standard,
|
||||||
|
1992-04-01,1994-01-01,BE,EUR,0.195,standard,
|
||||||
|
1983-01-01,1992-04-01,BE,EUR,0.19,standard,
|
||||||
|
1981-07-01,1983-01-01,BE,EUR,0.17,standard,
|
||||||
|
1978-07-01,1981-07-01,BE,EUR,0.16,standard,
|
||||||
|
1971-07-01,1978-07-01,BE,EUR,0.18,standard,
|
||||||
|
1999-01-01,,BG,BGN,0.2,standard,Bulgaria (member state) standard VAT rate.
|
||||||
|
1996-07-01,1999-01-01,BG,BGN,0.22,standard,
|
||||||
|
1994-04-01,1996-07-01,BG,BGN,0.18,standard,
|
||||||
|
2011-01-04,,BM,BMD,0,standard,Bermuda (British overseas territory) is exempted of VAT.
|
||||||
|
2014-01-13,,"CY
|
||||||
|
GB-BFPO 57
|
||||||
|
GB-BFPO 58
|
||||||
|
GB-BFPO 59
|
||||||
|
UK-BFPO 57
|
||||||
|
UK-BFPO 58
|
||||||
|
UK-BFPO 59",EUR,0.19,standard,"Cyprus (member state) standard VAT rate.
|
||||||
|
Akrotiri and Dhekelia (British overseas territory) is subjected to Cyprus' standard VAT rate."
|
||||||
|
2013-01-14,2014-01-13,CY,EUR,0.18,standard,
|
||||||
|
2012-03-01,2013-01-14,CY,EUR,0.17,standard,
|
||||||
|
2003-01-01,2012-03-01,CY,EUR,0.15,standard,
|
||||||
|
2002-07-01,2003-01-01,CY,EUR,0.13,standard,
|
||||||
|
2000-07-01,2002-07-01,CY,EUR,0.1,standard,
|
||||||
|
1993-10-01,2000-07-01,CY,EUR,0.08,standard,
|
||||||
|
1992-07-01,1993-10-01,CY,EUR,0.05,standard,
|
||||||
|
2013-01-01,,CZ,CZK,0.21,standard,Czech Republic (member state) standard VAT rate.
|
||||||
|
2010-01-01,2013-01-01,CZ,CZK,0.2,standard,
|
||||||
|
2004-05-01,2010-01-01,CZ,CZK,0.19,standard,
|
||||||
|
1995-01-01,2004-05-01,CZ,CZK,0.22,standard,
|
||||||
|
1993-01-01,1995-01-01,CZ,CZK,0.23,standard,
|
||||||
|
2007-01-01,,DE,EUR,0.19,standard,Germany (member state) standard VAT rate.
|
||||||
|
1998-04-01,2007-01-01,DE,EUR,0.16,standard,
|
||||||
|
1993-01-01,1998-04-01,DE,EUR,0.15,standard,
|
||||||
|
1983-07-01,1993-01-01,DE,EUR,0.14,standard,
|
||||||
|
1979-07-01,1983-07-01,DE,EUR,0.13,standard,
|
||||||
|
1978-01-01,1979-07-01,DE,EUR,0.12,standard,
|
||||||
|
1968-07-01,1978-01-01,DE,EUR,0.11,standard,
|
||||||
|
1968-01-01,1968-07-01,DE,EUR,0.1,standard,
|
||||||
|
2007-01-01,,DE-27498,EUR,0,standard,Heligoland (German island) is exempted of VAT.
|
||||||
|
2007-01-01,,"DE-78266
|
||||||
|
CH-8238",EUR,0,standard,Busingen am Hochrhein (German territory) is exempted of VAT.
|
||||||
|
1992-01-01,,DK,DKK,0.25,standard,Denmark (member state) standard VAT rate.
|
||||||
|
1980-06-30,1992-01-01,DK,DKK,0.22,standard,
|
||||||
|
1978-10-30,1980-06-30,DK,DKK,0.2025,standard,
|
||||||
|
1977-10-03,1978-10-30,DK,DKK,0.18,standard,
|
||||||
|
1970-06-29,1977-10-03,DK,DKK,0.15,standard,
|
||||||
|
1968-04-01,1970-06-29,DK,DKK,0.125,standard,
|
||||||
|
1967-07-03,1968-04-01,DK,DKK,0.1,standard,
|
||||||
|
2009-07-01,,EE,EUR,0.2,standard,Estonia (member state) standard VAT rate.
|
||||||
|
1993-01-01,2009-07-01,EE,EUR,0.18,standard,
|
||||||
|
1991-01-01,1993-01-01,EE,EUR,0.1,standard,
|
||||||
|
2016-06-01,,"GR
|
||||||
|
EL",EUR,0.24,standard,Greece (member state) standard VAT rate.
|
||||||
|
2010-07-01,2016-06-01,"GR
|
||||||
|
EL",EUR,0.23,standard,
|
||||||
|
2010-03-15,2010-07-01,"GR
|
||||||
|
EL",EUR,0.21,standard,
|
||||||
|
2005-04-01,2010-03-15,"GR
|
||||||
|
EL",EUR,0.19,standard,
|
||||||
|
1990-04-28,2005-04-01,"GR
|
||||||
|
EL",EUR,0.18,standard,
|
||||||
|
1988-01-01,1990-04-28,"GR
|
||||||
|
EL",EUR,0.16,standard,
|
||||||
|
1987-01-01,1988-01-01,"GR
|
||||||
|
EL",EUR,0.18,standard,
|
||||||
|
2012-09-01,,ES,EUR,0.21,standard,Spain (member state) standard VAT rate.
|
||||||
|
2010-07-01,2012-09-01,ES,EUR,0.18,standard,
|
||||||
|
1995-01-01,2010-07-01,ES,EUR,0.16,standard,
|
||||||
|
1992-08-01,1995-01-01,ES,EUR,0.15,standard,
|
||||||
|
1992-01-01,1992-08-01,ES,EUR,0.13,standard,
|
||||||
|
1986-01-01,1992-01-01,ES,EUR,0.12,standard,
|
||||||
|
2012-09-01,,"ES-CN
|
||||||
|
ES-GC
|
||||||
|
ES-TF
|
||||||
|
IC",EUR,0,standard,Canary Islands (Spanish autonomous community) is exempted of VAT.
|
||||||
|
2012-09-01,,"ES-ML
|
||||||
|
ES-CE
|
||||||
|
EA",EUR,0,standard,Ceuta and Melilla (Spanish autonomous cities) is exempted of VAT.
|
||||||
|
2013-01-01,,FI,EUR,0.24,standard,Finland (member state) standard VAT rate.
|
||||||
|
2010-07-01,2013-01-01,FI,EUR,0.23,standard,
|
||||||
|
1994-06-01,2010-07-01,FI,EUR,0.22,standard,
|
||||||
|
2013-01-01,,"FI-01
|
||||||
|
AX",EUR,0,standard,Aland Islands (Finish autonomous region) is exempted of VAT.
|
||||||
|
2011-01-04,,FK,FKP,0,standard,Falkland Islands (British overseas territory) is exempted of VAT.
|
||||||
|
1992-01-01,,FO,DKK,0,standard,Faroe Islands (Danish autonomous country) is exempted of VAT.
|
||||||
|
2014-01-01,,"FR
|
||||||
|
MC",EUR,0.2,standard,"France (member state) standard VAT rate.
|
||||||
|
Monaco (sovereign city-state) is member of the EU VAT area and subjected to France's standard VAT rate."
|
||||||
|
2000-04-01,2014-01-01,"FR
|
||||||
|
MC",EUR,0.196,standard,
|
||||||
|
1995-08-01,2000-04-01,"FR
|
||||||
|
MC",EUR,0.206,standard,
|
||||||
|
1982-07-01,1995-08-01,"FR
|
||||||
|
MC",EUR,0.186,standard,
|
||||||
|
1977-01-01,1982-07-01,"FR
|
||||||
|
MC",EUR,0.176,standard,
|
||||||
|
1973-01-01,1977-01-01,"FR
|
||||||
|
MC",EUR,0.2,standard,
|
||||||
|
1970-01-01,1973-01-01,"FR
|
||||||
|
MC",EUR,0.23,standard,
|
||||||
|
1968-12-01,1970-01-01,"FR
|
||||||
|
MC",EUR,0.19,standard,
|
||||||
|
1968-01-01,1968-12-01,"FR
|
||||||
|
MC",EUR,0.1666,standard,
|
||||||
|
2014-01-01,,"FR-BL
|
||||||
|
BL",EUR,0,standard,Saint Barthelemy (French overseas collectivity) is exempted of VAT.
|
||||||
|
2014-01-01,,"FR-GF
|
||||||
|
GF",EUR,0,standard,Guiana (French overseas department) is exempted of VAT.
|
||||||
|
2014-01-01,,"FR-GP
|
||||||
|
GP",EUR,0.085,standard,Guadeloupe (French overseas department) special VAT rate.
|
||||||
|
2014-01-01,,"FR-MF
|
||||||
|
MF",EUR,0,standard,Saint Martin (French overseas collectivity) is subjected to France's standard VAT rate.
|
||||||
|
2014-01-01,,"FR-MQ
|
||||||
|
MQ",EUR,0.085,standard,Martinique (French overseas department) special VAT rate.
|
||||||
|
2014-01-01,,"FR-NC
|
||||||
|
NC",XPF,0,standard,New Caledonia (French special collectivity) is exempted of VAT.
|
||||||
|
2014-01-01,,"FR-PF
|
||||||
|
PF",XPF,0,standard,French Polynesia (French overseas collectivity) is exempted of VAT.
|
||||||
|
2014-01-01,,"FR-PM
|
||||||
|
PM",EUR,0,standard,Saint Pierre and Miquelon (French overseas collectivity) is exempted of VAT.
|
||||||
|
2014-01-01,,"FR-RE
|
||||||
|
RE",EUR,0.085,standard,Reunion (French overseas department) special VAT rate.
|
||||||
|
2014-01-01,,"FR-TF
|
||||||
|
TF",EUR,0,standard,French Southern and Antarctic Lands (French overseas territory) is exempted of VAT.
|
||||||
|
2014-01-01,,"FR-WF
|
||||||
|
WF",XPF,0,standard,Wallis and Futuna (French overseas collectivity) is exempted of VAT.
|
||||||
|
2014-01-01,,"FR-YT
|
||||||
|
YT",EUR,0,standard,Mayotte (French overseas department) is exempted of VAT.
|
||||||
|
2011-01-04,,GG,GBP,0,standard,Guernsey (British Crown dependency) is exempted of VAT.
|
||||||
|
2011-01-04,,GI,GIP,0,standard,Gibraltar (British overseas territory) is exempted of VAT.
|
||||||
|
1992-01-01,,GL,DKK,0,standard,Greenland (Danish autonomous country) is exempted of VAT.
|
||||||
|
2010-07-01,2016-06-01,"GR-34007
|
||||||
|
EL-34007",EUR,0.16,standard,Skyros (Greek island) special VAT rate.
|
||||||
|
2010-07-01,2016-06-01,"GR-37002
|
||||||
|
GR-37003
|
||||||
|
GR-37005
|
||||||
|
EL-37002
|
||||||
|
EL-37003
|
||||||
|
EL-37005",EUR,0.16,standard,Northern Sporades (Greek islands) special VAT rate.
|
||||||
|
2010-07-01,2016-06-01,"GR-64004
|
||||||
|
EL-64004",EUR,0.16,standard,Thasos (Greek island) special VAT rate.
|
||||||
|
2010-07-01,2016-06-01,"GR-68002
|
||||||
|
EL-68002",EUR,0.16,standard,Samothrace (Greek island) special VAT rate.
|
||||||
|
2010-07-01,,"GR-69
|
||||||
|
EL-69",EUR,0,standard,Mount Athos (Greek self-governed part) is exempted of VAT.
|
||||||
|
2010-07-01,2016-06-01,"GR-81
|
||||||
|
EL-81",EUR,0.16,standard,Dodecanese (Greek department) special VAT rate.
|
||||||
|
2010-07-01,2016-06-01,"GR-82
|
||||||
|
EL-82",EUR,0.16,standard,Cyclades (Greek department) special VAT rate.
|
||||||
|
2010-07-01,2016-06-01,"GR-83
|
||||||
|
EL-83",EUR,0.16,standard,Lesbos (Greek department) special VAT rate.
|
||||||
|
2010-07-01,2016-06-01,"GR-84
|
||||||
|
EL-84",EUR,0.16,standard,Samos (Greek department) special VAT rate.
|
||||||
|
2010-07-01,2016-06-01,"GR-85
|
||||||
|
EL-85",EUR,0.16,standard,Chios (Greek department) special VAT rate.
|
||||||
|
2011-01-04,,GS,GBP,0,standard,South Georgia and the South Sandwich Islands (British overseas territory) is exempted of VAT.
|
||||||
|
2012-03-01,,HR,HRK,0.25,standard,Croatia (member state) standard VAT rate.
|
||||||
|
2009-08-01,2012-03-01,HR,HRK,0.23,standard,
|
||||||
|
1998-08-01,2009-08-01,HR,HRK,0.22,standard,
|
||||||
|
2012-01-01,,HU,HUF,0.27,standard,Hungary (member state) standard VAT rate.
|
||||||
|
2009-07-01,2012-01-01,HU,HUF,0.25,standard,
|
||||||
|
2006-01-01,2009-07-01,HU,HUF,0.2,standard,
|
||||||
|
1988-01-01,2006-01-01,HU,HUF,0.25,standard,
|
||||||
|
2012-01-01,,IE,EUR,0.23,standard,Republic of Ireland (member state) standard VAT rate.
|
||||||
|
2010-01-01,2012-01-01,IE,EUR,0.21,standard,
|
||||||
|
2008-12-01,2010-01-01,IE,EUR,0.215,standard,
|
||||||
|
2002-03-01,2008-12-01,IE,EUR,0.21,standard,
|
||||||
|
2001-01-01,2002-03-01,IE,EUR,0.2,standard,
|
||||||
|
1991-03-01,2001-01-01,IE,EUR,0.21,standard,
|
||||||
|
1990-03-01,1991-03-01,IE,EUR,0.23,standard,
|
||||||
|
1986-03-01,1990-03-01,IE,EUR,0.25,standard,
|
||||||
|
1983-05-01,1986-03-01,IE,EUR,0.23,standard,
|
||||||
|
1983-03-01,1983-05-01,IE,EUR,0.35,standard,
|
||||||
|
1982-05-01,1983-03-01,IE,EUR,0.3,standard,
|
||||||
|
1980-05-01,1982-05-01,IE,EUR,0.25,standard,
|
||||||
|
1976-03-01,1980-05-01,IE,EUR,0.2,standard,
|
||||||
|
1973-09-03,1976-03-01,IE,EUR,0.195,standard,
|
||||||
|
1972-11-01,1973-09-03,IE,EUR,0.1637,standard,
|
||||||
|
2011-01-04,,IO,GBP,0,standard,British Indian Ocean Territory (British overseas territory) is exempted of VAT.
|
||||||
|
2013-10-01,,IT,EUR,0.22,standard,Italy (member state) standard VAT rate.
|
||||||
|
2011-09-17,2013-10-01,IT,EUR,0.21,standard,
|
||||||
|
1997-10-01,2011-09-17,IT,EUR,0.2,standard,
|
||||||
|
1988-08-01,1997-10-01,IT,EUR,0.19,standard,
|
||||||
|
1982-08-05,1988-08-01,IT,EUR,0.18,standard,
|
||||||
|
1981-01-01,1982-08-05,IT,EUR,0.15,standard,
|
||||||
|
1980-11-01,1981-01-01,IT,EUR,0.14,standard,
|
||||||
|
1980-07-03,1980-11-01,IT,EUR,0.15,standard,
|
||||||
|
1977-02-08,1980-07-03,IT,EUR,0.14,standard,
|
||||||
|
1973-01-01,1977-02-08,IT,EUR,0.12,standard,
|
||||||
|
2013-10-01,,"IT-22060
|
||||||
|
CH-6911",CHF,0,standard,Campione (Italian town) is exempted of VAT.
|
||||||
|
2013-10-01,,IT-23030,EUR,0,standard,Livigno (Italian town) is exempted of VAT.
|
||||||
|
2011-01-04,,JE,GBP,0,standard,Jersey (British Crown dependency) is exempted of VAT.
|
||||||
|
2011-01-04,,KY,KYD,0,standard,Cayman Islands (British overseas territory) is exempted of VAT.
|
||||||
|
2009-09-01,,LT,EUR,0.21,standard,Lithuania (member state) standard VAT rate.
|
||||||
|
2009-01-01,2009-09-01,LT,EUR,0.19,standard,
|
||||||
|
1994-05-01,2009-01-01,LT,EUR,0.18,standard,
|
||||||
|
2015-01-01,,LU,EUR,0.17,standard,Luxembourg (member state) standard VAT rate.
|
||||||
|
1992-01-01,2015-01-01,LU,EUR,0.15,standard,
|
||||||
|
1983-07-01,1992-01-01,LU,EUR,0.12,standard,
|
||||||
|
1971-01-01,1983-07-01,LU,EUR,0.1,standard,
|
||||||
|
1970-01-01,1971-01-01,LU,EUR,0.8,standard,
|
||||||
|
2012-07-01,,LV,EUR,0.21,standard,Latvia (member state) standard VAT rate.
|
||||||
|
2011-01-01,2012-07-01,LV,EUR,0.22,standard,
|
||||||
|
2009-01-01,2011-01-01,LV,EUR,0.21,standard,
|
||||||
|
1995-05-01,2009-01-01,LV,EUR,0.18,standard,
|
||||||
|
2011-01-04,,MS,XCD,0,standard,Montserrat (British overseas territory) is exempted of VAT.
|
||||||
|
2004-01-01,,MT,EUR,0.18,standard,Malta (member state) standard VAT rate.
|
||||||
|
1995-01-01,2004-01-01,MT,EUR,0.15,standard,
|
||||||
|
2012-10-01,,NL,EUR,0.21,standard,Netherlands (member state) standard VAT rate.
|
||||||
|
2001-01-01,2012-10-01,NL,EUR,0.19,standard,
|
||||||
|
1992-10-01,2001-01-01,NL,EUR,0.175,standard,
|
||||||
|
1989-01-01,1992-10-01,NL,EUR,0.185,standard,
|
||||||
|
1986-10-01,1989-01-01,NL,EUR,0.2,standard,
|
||||||
|
1984-01-01,1986-10-01,NL,EUR,0.19,standard,
|
||||||
|
1976-01-01,1984-01-01,NL,EUR,0.18,standard,
|
||||||
|
1973-01-01,1976-01-01,NL,EUR,0.16,standard,
|
||||||
|
1971-01-01,1973-01-01,NL,EUR,0.14,standard,
|
||||||
|
1969-01-01,1971-01-01,NL,EUR,0.12,standard,
|
||||||
|
2012-10-01,,"NL-AW
|
||||||
|
AW",AWG,0,standard,Aruba (Dutch country) are exempted of VAT.
|
||||||
|
2012-10-01,,"NL-CW
|
||||||
|
NL-SX
|
||||||
|
CW
|
||||||
|
SX",ANG,0,standard,Curacao and Sint Maarten (Dutch countries) are exempted of VAT.
|
||||||
|
2012-10-01,,"NL-BQ1
|
||||||
|
NL-BQ2
|
||||||
|
NL-BQ3
|
||||||
|
BQ
|
||||||
|
BQ-BO
|
||||||
|
BQ-SA
|
||||||
|
BQ-SE",USD,0,standard,"Bonaire, Saba and Sint Eustatius (Dutch special municipalities) are exempted of VAT."
|
||||||
|
2011-01-01,,PL,PLN,0.23,standard,Poland (member state) standard VAT rate.
|
||||||
|
1993-01-08,2011-01-01,PL,PLN,0.22,standard,
|
||||||
|
2011-01-04,,PN,NZD,0,standard,Pitcairn Islands (British overseas territory) is exempted of VAT.
|
||||||
|
2011-01-01,,PT,EUR,0.23,standard,Portugal (member state) standard VAT rate.
|
||||||
|
2010-07-01,2011-01-01,PT,EUR,0.21,standard,
|
||||||
|
2008-07-01,2010-07-01,PT,EUR,0.2,standard,
|
||||||
|
2005-07-01,2008-07-01,PT,EUR,0.21,standard,
|
||||||
|
2002-06-05,2005-07-01,PT,EUR,0.19,standard,
|
||||||
|
1995-01-01,2002-06-05,PT,EUR,0.17,standard,
|
||||||
|
1992-03-24,1995-01-01,PT,EUR,0.16,standard,
|
||||||
|
1988-02-01,1992-03-24,PT,EUR,0.17,standard,
|
||||||
|
1986-01-01,1988-02-01,PT,EUR,0.16,standard,
|
||||||
|
2011-01-01,,PT-20,EUR,0.18,standard,Azores (Portuguese autonomous region) special VAT rate.
|
||||||
|
2011-01-01,,PT-30,EUR,0.22,standard,Madeira (Portuguese autonomous region) special VAT rate.
|
||||||
|
2017-01-01,,RO,RON,0.19,standard,Romania (member state) standard VAT rate.
|
||||||
|
2016-01-01,2017-01-01,RO,RON,0.2,standard,Romania (member state) standard VAT rate.
|
||||||
|
2010-07-01,2016-01-01,RO,RON,0.24,standard,
|
||||||
|
2000-01-01,2010-07-01,RO,RON,0.19,standard,
|
||||||
|
1998-02-01,2000-01-01,RO,RON,0.22,standard,
|
||||||
|
1993-07-01,1998-02-01,RO,RON,0.18,standard,
|
||||||
|
1990-07-01,,SE,SEK,0.25,standard,Sweden (member state) standard VAT rate.
|
||||||
|
1983-01-01,1990-07-01,SE,SEK,0.2346,standard,
|
||||||
|
1981-11-16,1983-01-01,SE,SEK,0.2151,standard,
|
||||||
|
1980-09-08,1981-11-16,SE,SEK,0.2346,standard,
|
||||||
|
1977-06-01,1980-09-08,SE,SEK,0.2063,standard,
|
||||||
|
1971-01-01,1977-06-01,SE,SEK,0.1765,standard,
|
||||||
|
1969-01-01,1971-01-01,SE,SEK,0.1111,standard,
|
||||||
|
2011-01-04,,"AC
|
||||||
|
SH
|
||||||
|
SH-AC
|
||||||
|
SH-HL",SHP,0,standard,Ascension and Saint Helena (British overseas territory) is exempted of VAT.
|
||||||
|
2011-01-04,,"TA
|
||||||
|
SH-TA",GBP,0,standard,Tristan da Cunha (British oversea territory) is exempted of VAT.
|
||||||
|
2013-07-01,,SI,EUR,0.22,standard,Slovenia (member state) standard VAT rate.
|
||||||
|
2002-01-01,2013-07-01,SI,EUR,0.2,standard,
|
||||||
|
1999-07-01,2002-01-01,SI,EUR,0.19,standard,
|
||||||
|
2011-01-01,,SK,EUR,0.2,standard,Slovakia (member state) standard VAT rate.
|
||||||
|
2004-01-01,2011-01-01,SK,EUR,0.19,standard,
|
||||||
|
2003-01-01,2004-01-01,SK,EUR,0.2,standard,
|
||||||
|
1996-01-01,2003-01-01,SK,EUR,0.23,standard,
|
||||||
|
1993-08-01,1996-01-01,SK,EUR,0.25,standard,
|
||||||
|
1993-01-01,1993-08-01,SK,EUR,0.23,standard,
|
||||||
|
2011-01-04,,TC,USD,0,standard,Turks and Caicos Islands (British overseas territory) is exempted of VAT.
|
||||||
|
2011-01-04,,"GB
|
||||||
|
UK
|
||||||
|
IM",GBP,0.2,standard,"United Kingdom (member state) standard VAT rate.
|
||||||
|
Isle of Man (British self-governing dependency) is member of the EU VAT area and subjected to UK's standard VAT rate."
|
||||||
|
2010-01-01,2011-01-04,"GB
|
||||||
|
UK
|
||||||
|
IM",GBP,0.175,standard,
|
||||||
|
2008-12-01,2010-01-01,"GB
|
||||||
|
UK
|
||||||
|
IM",GBP,0.15,standard,
|
||||||
|
1991-04-01,2008-12-01,"GB
|
||||||
|
UK
|
||||||
|
IM",GBP,0.175,standard,
|
||||||
|
1979-06-18,1991-04-01,"GB
|
||||||
|
UK
|
||||||
|
IM",GBP,0.15,standard,
|
||||||
|
1974-07-29,1979-06-18,"GB
|
||||||
|
UK
|
||||||
|
IM",GBP,0.08,standard,
|
||||||
|
1973-04-01,1974-07-29,"GB
|
||||||
|
UK
|
||||||
|
IM",GBP,0.1,standard,
|
||||||
|
2011-01-04,,VG,USD,0,standard,British Virgin Islands (British overseas territory) is exempted of VAT.
|
||||||
|
2014-01-01,,CP,EUR,0,standard,Clipperton Island (French overseas possession) is exempted of VAT.
|
||||||
|
2019-11-15,,CH,CHF,0.077,standard,Switzerland standard VAT (added manually)
|
||||||
|
2019-11-15,,MC,EUR,0.196,standard,Monaco standard VAT (added manually)
|
||||||
|
2019-11-15,,FR,EUR,0.2,standard,France standard VAT (added manually)
|
||||||
|
2019-11-15,,GR,EUR,0.24,standard,Greece standard VAT (added manually)
|
||||||
|
2019-11-15,,GB,EUR,0.2,standard,UK standard VAT (added manually)
|
||||||
|
2019-12-17,,AD,EUR,0.045,standard,Andorra standard VAT (added manually)
|
||||||
|
2019-12-17,,TK,EUR,0.18,standard,Turkey standard VAT (added manually)
|
||||||
|
2019-12-17,,IS,EUR,0.24,standard,Iceland standard VAT (added manually)
|
||||||
|
2019-12-17,,FX,EUR,0.20,standard,France metropolitan standard VAT (added manually)
|
||||||
|
2020-01-04,,CY,EUR,0.19,standard,Cyprus standard VAT (added manually)
|
||||||
|
2019-01-04,,IL,EUR,0.23,standard,Ireland standard VAT (added manually)
|
||||||
|
2019-01-04,,LI,EUR,0.077,standard,Liechtenstein standard VAT (added manually)
|
|
Loading…
Reference in a new issue