Author(s): Daan van den Bergh.
Copyright: © 2020 Daan van den Bergh All Rights Reserved.
Supported Operating Systems: macos & linux.
Website library.
Install the package.
pip3 install w3bsite --upgrade
arch -arch x86_64 /usr/bin/python3 -m pip install firebase-admin
1: Go to https://namecheap.com and sign up / sign in.
2: Link a credit card to your account.
3: $50 balance is required to activate the developer api, so add balance if you did not reach this limit yet.
4: Enable the developer API.
5: Whitelist your public ip (https://aruljohn.com).
6: Note / copy the api key which will be required later.
Create a file named "website.py" in your website's root directory.
my-website/
website.py
/
Add the following code to the file.
#!/usr/bin/env python3
from w3bsite import Website
from dev0s import *
website = Website(
...
)
if __name__ == "__main__":
website.cli()
- Database
- Deployment
- Django
- Firebase
- Logging
- Payments
- Users
- Views
- Website
The database object class.
# import the website.db object class.
import w3bsite
# call database.load.
response = database.load(path=None)
# call database.save.
response = database.save(path=None, data=None, overwrite=False)
# call database.delete.
response = database.delete(path=None)
# call database.names.
response = database.names(
# the sub path (leave None to use the root path)
path=None, )
# call database.subpath.
_ = database.subpath(fullpath)
# call database.fullpath.
_ = database.fullpath(subpath)
# call database.join.
_ = database.join(name=None, type="")
The vps object class.
# import the website.vps object class.
import w3bsite
# call vps.configure.
response = vps.configure(reinstall=False, log_level=0)
# call vps.deploy.
response = vps.deploy(code_update=False, reinstall=False, log_level=0)
The deployment object class.
# import the website.deployment object class.
import w3bsite
# call deployment.start.
response = deployment.start(log_level=dev0s.defaults.options.log_level)
# call deployment.stop.
response = deployment.stop(log_level=dev0s.defaults.options.log_level)
# call deployment.restart.
response = deployment.restart(log_level=dev0s.defaults.options.log_level)
# call deployment.status.
response = deployment.status(log_level=dev0s.defaults.options.log_level)
# call deployment.reset_logs.
response = deployment.reset_logs(log_level=dev0s.defaults.options.log_level)
# call deployment.tail.
response = deployment.tail(nginx=False, debug=False)
# call deployment.configure.
response = deployment.configure(reinstall=False, log_level=0, loader=None)
# call deployment.deploy.
response = deployment.deploy(code_update=False, reinstall=False, log_level=0)
# call deployment.generate_tls.
response = deployment.generate_tls(log_level=0)
# call deployment.activate_tls.
response = deployment.activate_tls(log_level=0)
# call deployment.bundle_tls.
response = deployment.bundle_tls(directory, log_level=0)
# call deployment.check_dns.
response = deployment.check_dns(log_level=0)
The namecheap object class.
# import the website.namecheap object class.
import w3bsite
# call namecheap.check_domain.
response = namecheap.check_domain(domain=None)
# call namecheap.get_domains.
response = namecheap.get_domains()
# call namecheap.get_info.
response = namecheap.get_info(domain=None)
# call namecheap.get_dns.
response = namecheap.get_dns(domain=None)
# call namecheap.check_dns.
response = namecheap.check_dns(
# the domain (optional).
domain=None,
# the dns record type,
type=None,
# the dns record host,
host=None,
# the dns record value/address,
value=None,
# the get_dns.records dictionary (optionally to increase speed).
records=None, )
# call namecheap.set_dns.
response = namecheap.set_dns(
# the domain (optional).
domain=None,
# the dns records (erases all others).
records={
"$record-1":{
# the dns record type (required),
"type":None,
# the dns record host (required),
"host":None,
# the dns record value/address (required),
"value":None,
# the dns record ttl (optional default is 1800),
"ttl":1800,
},
}, )
# call namecheap.add_dns.
response = namecheap.add_dns(
# the domain (optional).
domain=None,
# the dns record type,
type=None,
# the dns record host,
host=None,
# the dns record value/address,
value=None,
# the dns record ttl (optional default is 1800),
ttl=1800,
# the get_dns.records dictionary (optionally to increase speed).
records=None, )
# call namecheap.tag_dns.
response = namecheap.tag_dns(
# the dns record type,
type=None,
# the dns record host,
host=None,
# the dns record value/address,
value=None, )
# call namecheap.get_sld_and_tld.
response = namecheap.get_sld_and_tld(domain=None)
# call namecheap.get_tls.
response = namecheap.get_tls()
# call namecheap.create_tls.
response = namecheap.create_tls(
# the expiration years.
years=2,
# the tls type.
type="PositiveSSL", )
# call namecheap.activate_tls.
response = namecheap.activate_tls(
# the certificate's id.
certificate_id=None, )
The django object class.
# import the website.django object class.
import w3bsite
# call django.start.
response = django.start(host="127.0.0.1", port="8000", production=False)
# call django.create.
response = django.create()
# call django.create_app.
response = django.create_app(name="home")
# call django.migrations.
response = django.migrations(forced=False, log_level=dev0s.defaults.options.log_level)
# call django.collect_static.
response = django.collect_static(log_level=dev0s.defaults.options.log_level)
The users object class.
# import the website.django.users object class.
import w3bsite
# call users.create.
response = users.create(
username=None,
email=None,
password=None,
name=None,
superuser=False, )
# call users.update.
response = users.update(
# required.
username=None,
# optionals.
email=None,
password=None,
name=None,
superuser=None, )
# call users.authenticate.
response = users.authenticate(
# the login credentials.
username=None,
password=None,
# the request.
request=None,
# login the user.
login=True, )
# call users.delete.
response = users.delete(username=None)
# call users.get.
response = users.get(
# select one of the following user id options:
username=None,
email=None, )
# call users.exists.
response = users.exists(
# option 1:
# by username (much faster).
username=None,
# option 2:
# by email.
email=None, )
The firebase object class.
# import the website.firebase object class.
import w3bsite
The fire_store object class.
# import the website.firebase.firestore object class.
import w3bsite
# call fire_store.list.
response = fire_store.list(reference)
# call fire_store.load.
response = fire_store.load(reference)
# call fire_store.load_collection.
response = fire_store.load_collection(reference)
# call fire_store.save.
response = fire_store.save(reference, data)
# call fire_store.delete.
response = fire_store.delete(reference)
The users object class.
# import the website.firebase.users object class.
import w3bsite
# call users.get.
response = users.get(
# define one of the following parameters.
uid=None,
email=None,
phone_number=None, )
# call users.create.
response = users.create(
# required:
email=None,
password=None,
verify_password=None,
# optionals:
name=None,
phone_number=None,
photo_url=None,
email_verified=False, )
# call users.update.
response = users.update(
# required:
email=None,
# optionals:
name=None,
password=None,
verify_password=None,
phone_number=None,
photo_url=None,
email_verified=None, )
# call users.delete.
response = users.delete(
# option 1:
# the user's uid (much faster).
uid=None,
# option 2:
# the users email / username.
email=None, )
# call users.verify_id_token.
response = users.verify_id_token(id_token)
The w3bsite.classes.views.defaults.include_apps function.
# call w3bsite.classes.views.defaults.include_apps.
_ = w3bsite.classes.views.defaults.include_apps(apps=[], auto_include=False)
The w3bsite.classes.views.defaults.build_urls function.
# call w3bsite.classes.views.defaults.build_urls.
_ = w3bsite.classes.views.defaults.build_urls(views=[])
The w3bsite.example.manage.main function.
# call w3bsite.example.manage.main.
_ = w3bsite.example.manage.main()
The logging object class.
# import the website.logging object class.
import w3bsite
# call logging.log.
response = logging.log(
# option 1:
# the message (#1 param).
message=None,
# option 2:
# the error.
error=None,
# option 3:
# the response dict (leave message None to use).
response={},
# print the response as json.
json=False,
# optionals:
# the active log level.
log_level=0,
# the required log level for when printed to console (leave None to use logging.log_level).
required_log_level=None,
# save to log file.
save=False,
# save errors always (for options 2 & 3 only).
save_errors=None,
# the log mode (leave None for default).
mode=None, )
# call logging.load_logs.
response = logging.load_logs(format="webserver", options=["webserver", "cli", "array", "string"])
# call logging.reset_logs.
response = logging.reset_logs(format="webserver", options=["webserver", "cli", "array", "string"])
# call logging.log_to_file.
response = logging.log_to_file(message, raw=False)
The alerts object class.
# import the website.logging.alerts object class.
import w3bsite
# call alerts.save.
_ = alerts.save(
# the alert's id (str).
id="testalert",
# the alert's title (str).
title="Warning!",
# the alert's message (str).
message="Some message.",
# the alert's right button redirect url (str).
redirect="/dashboard/home/",
# the alert's right button redirect text (str).
redirect_button="Ok",
# the alert's icon path.
icon="/media/icons/warning.png",
# the urls on which the alert will be shown (list) (use [*] for all urls).
urls=["*"],
# the users to which the alert will be shown (list) (use [*] for all users).
users=["*"], )
# call alerts.check.
response = alerts.check(
# specific alert id's (str, list) (optional).
id=None,
# the active user (str) (optional).
username=None,
# the active url (str) (optional).
url=None, )
# call alerts.mark.
_ = alerts.mark(
# the alert's id.
id=None,
# the alert's timestamp.
timestamp=None, )
The stripe object class.
# import the website.stripe object class.
import w3bsite
# call stripe.check.
response = stripe.check()
# call stripe.get_product_id.
response = stripe.get_product_id(product=None)
# call stripe.get_plan_id.
response = stripe.get_plan_id(product=None, plan=None)
# call stripe.get_product_id_by_plan_id.
response = stripe.get_product_id_by_plan_id(plan_id)
# call stripe.get_product_name.
response = stripe.get_product_name(id=None)
# call stripe.get_plan_name.
response = stripe.get_plan_name(id=None)
The customers object class.
# import the website.stripe.customers object class.
import w3bsite
# call customers.check.
response = customers.check(
# the users email.
email=None, )
# call customers.create.
response = customers.create(
# the users email.
email=None, )
# call customers.delete.
response = customers.delete(
# the stripe customer id.
id=None, )
# call customers.get_id.
response = customers.get_id(
# the users email.
email=None, )
# call customers.get.
response = customers.get(
# the stripe customer id (optional).
id=None, )
# call customers.get_cards.
response = customers.get_cards(
# the stripe customer id.
id=None, )
# call customers.create_card.
response = customers.create_card(
# the stripe customer id.
id=None,
# the card holders name.
name=None,
# the card number.
number=None,
# the card expiration month.
month=None,
# the card expiration year.
year=None,
# the card cvc.
cvc=None, )
# call customers.delete_card.
response = customers.delete_card(
# the stripe customer id.
id=None, )
The subscriptions object class.
# import the website.stripe.subscriptions object class.
import w3bsite
# call subscriptions.create.
response = subscriptions.create(
# the email of the user that will be charged.
email=None,
customer_id=None, # instead of email for effienciency.
# the plan ids (list).
plans=[], )
# call subscriptions.get.
response = subscriptions.get(
# a specfic user email (optional).
email=None,
# active subscription plans only.
active_only=True,
# by customer id (custumer id as keys values in return).
by_customer_id=False, )
# call subscriptions.cancel.
response = subscriptions.cancel(
# option 1:
# the stripe subscription id.
subscription_id=None,
# option 2:
# select a user identification option.
email=None,
# the stripe plan id.
plan=None, )
The plans object class.
# import the website.stripe.plans object class.
import w3bsite
# call plans.get.
response = plans.get(
# the plan id (plan_***) (optional).
id=None,
# get the subscriptions of the plan.
get_subscriptions=False,
# get active subscriptions only (required get_subscriptions=True).
active_only=True, )
# call plans.create.
response = plans.create(
# the plan id.
id=None,
# the product id.
product=None,
# price per month.
price=None,
# the price currencry.
currency="eur",
# recurring options (do not edit unless you know what you are doing).
recurring={"interval": "month"}, )
The users object class.
# import the website.users object class.
import w3bsite
# call users.get.
_ = users.get(
# define one of the following user id parameters.
username=None,
email=None, )
# call users.create.
response = users.create(
# required:
username=None,
email=None,
password=None,
# optionals:
verify_password=None,
name=None,
superuser=False, )
# call users.update.
response = users.update(
# required:
email=None,
# optionals:
name=None,
password=None,
verify_password=None,
superuser=None,
#phone_number=None,
#photo_url=None,
#email_verified=None, )
# call users.delete.
response = users.delete(
# the user's email.
email=None,
# the user's username.
username=None, )
# call users.exists.
_ = users.exists(
# one of the user id options is required.
username=None,
email=None,
# the filter (django).
filter="django", )
# call users.authenticate.
response = users.authenticate(
# the users username.
username=None,
# the users password.
password=None,
# the 2fa code.
_2fa_code=None,
# the 2fa enabled boolean.
# leave None to use the users._2fa settings and specify to overwrite.
_2fa=None,
# the html for the verification code email (str).
html="",
# the request object.
request=None, )
# call users.signout.
response = users.signout(
# the request object (obj) (#1).
request=None, )
# call users.authenticated.
response = users.authenticated(
# the request (#1).
request=None, )
# call users.root_permission.
response = users.root_permission(
# the request (#1).
request=None, )
# call users.load_data.
response = users.load_data(
# the user's email.
email=None,
# the user's username.
username=None,
# the create boolean (do not use).
create=False, )
# call users.save_data.
response = users.save_data(
# the user's email.
email=None,
# the user's username.
username=None,
# the user's data.
data={},
# the overwrite boolean.
overwrite=False, )
# call users.send_email.
response = users.send_email(
# define email to retrieve user.
email=None,
username=None,
# the email title.
title="Account Activation",
# the html (str).
html="", )
# call users.send_code.
response = users.send_code(
# define username / email to retrieve user.
username=None,
email=None,
# the clients ip.
ip="unknown",
# the mode id.
mode="verification",
# the mode title.
title="Account Activation",
# the html (str).
html="",
# optionally specify the code (leave None to generate).
code=None, )
# call users.verify_code.
response = users.verify_code(
# define email to retrieve user.
username=None,
email=None,
# the user entered code.
code=000000,
# the message mode.
mode="verification", )
# call users.verify_api_key.
response = users.verify_api_key(api_key=None, request=None)
# call users.verify_subscription.
response = users.verify_subscription(
# select one of the following user id options:
email=None,
username=None,
api_key=None,
# the subscription product.
product=None,
# the subscription plans that will return a success verification (["*"] for all plans within the product).
plans=[], )
# call users.create_subscription.
response = users.create_subscription(
# select one of the following user id options:
email=None,
username=None,
api_key=None,
# the subscription product.
product=None,
# the subscription plan.
plan=None,
# the card holders name.
card_name=None,
# the card number.
card_number=None,
# the card expiration month.
card_expiration_month=None,
# the card expiration year.
card_expiration_year=None,
# the card cvc.
card_cvc=None, )
# call users.get_api_key.
response = users.get_api_key(email=None, username=None)
# call users.set_permission.
response = users.set_permission(email=None, username=None, permission_id=None, permission=True)
# call users.check_password.
response = users.check_password(
# password (#1).
password=None,
# verify password (#2).
verify_password=None,
# the strong password boolean.
strong=False, )
# call users.load_password.
response = users.load_password(email=None, username=None)
# call users.save_password.
response = users.save_password(email=None, username=None, password=None)
# call users.iterate.
_ = users.iterate(
# the filter of what to iterate.
filter="user",
# from which database to iterate (django / database).
database="database", )
# call users.synchronize.
response = users.synchronize(
# leave ids=None default to synchronize all users.
# optionally pass emails=[newuser@email.com] to synchronize new users.
emails=["*"],
usernames=["*"], )
The request object class.
# initialize the website.views.Request object class.
request = website.views.Request(
# the base path (required; if url path is null) [#1 argument].
base=None,
# the requests id (required) [#2 argument].
id=None,
# the url path (optional).
url=None,
# the w3bsite.Website object (required).
website=None,
# authentication required.
auth_required=False,
# root permission required.
root_required=False, )
# call request.success.
response = request.success(message, arguments={})
# call request.error.
response = request.error(error)
# call request.response.
response = request.response(response)
# call request._403.
_ = request._403(request=None)
# call request._404.
_ = request._404(request=None, error=None)
# call request._500.
_ = request._500(request=None, error=None)
# call request._503.
_ = request._503(request=None)
# call request.permission_denied.
_ = request.permission_denied(request=None)
# call request.maintenance.
_ = request.maintenance(request=None)
The view object class.
# initialize the website.views.View object class.
view = website.views.View(
# the base path (required; if url path is null) [#1 argument].
base=None,
# the views id (required) [#2 argument].
id=None,
# the url path (optional).
url=None,
# the html path (optional).
html=None,
# the w3bsite.Website object (required).
website=None,
# enable if this view is the [/] landing page.
landing_page=False,
# authentication required.
auth_required=False,
# root permission required.
root_required=False,
# the object type (do not edit).
type="View", )
# call view.render.
_ = view.render(
# the request (obj) (#1)
request,
# overwrite default template data. #2
template_data=None,
# overwrite default html #3.
html=None,
# the response's status code.
status=200, )
# call view.error.
_ = view.error(
# the django request parameter.
request,
# the error title.
title="Warning!",
# the error title.
message="Some error occured.",
# the error icon (the static directory is root).
icon="media/icons/warning.png",
# the redirect button text (right button).
redirect_button="Ok",
# the redirect url.
redirect="/dashboard/home/",
# overwrite default template data.
template_data=None,
# pass arguments by dict.
serialized={}, )
# call view._403.
_ = view._403(request, template_data=None)
# call view._404.
_ = view._404(request, template_data=None)
# call view._500.
_ = view._500(request, template_data=None, error=None)
# call view._503.
_ = view._503(request, template_data=None)
# call view.permission_denied.
_ = view.permission_denied(request, template_data=None)
# call view.maintenance.
_ = view.maintenance(request, template_data=None)
# call view.template.
_ = view.template(new={}, old=None, safe=False)
The security object class.
# import the website.security object class.
import w3bsite
# call security.generate_tls.
response = security.generate_tls()
# call security.set_secret_env.
response = security.set_secret_env(key, value)
# call security.get_secret_env.
_ = security.get_secret_env(key, default=None, required=True)
The website object class.
# initialize the w3bsite.Website object class.
website = w3bsite.Website(
#
# General.
# the root path.
root=None, # example: FilePath(__file__).base(back=1).replace("./","")
# the root domain.
domain=None,
# the website name.
name=None,
# the database path (optional).
database=None,
# the library path (optional).
library=None,
#a
# Deployment.
# remote depoyment, options: [local, vps, heroku].
remote="local",
#
# Developers.
# the developer users (emails).
developers=[],
#
# Django.
# maintenance boolean.
maintenance=False,
# the template data (only required when running the website) (overwrites the w3bsite template data keys).
template_data={},
# 2fa required for login.
_2fa=False,
#
# Organization.
# the author's / comitters name.
author=None,
# the admin's email.
email=None,
# the organization name.
organization=None,
# the organization unit.
organization_unit="Information Technology",
# the organization country code.
country_code="NL",
# the organization localization's city name.
city=None,
# the organization localization's province / state.
province=None,
#
# AES.
# the passphrase of the aes master-key (defaults is no passphrase).
aes_passphrase=None,
#
# Namecheap.
# namecheap enabled.
namecheap_enabled=True,
# your namecheap username.
namecheap_username=None,
# your namecheap api key.
namecheap_api_key=None,
#
# Firebase.
# firebase enabled.
firebase_enabled=True,
# your firebase admin service account key, (dict) [https://console.firebase.google.com > Service Accounts > Firebase admin].
firebase_admin={},
# your firebase sdk javascript configuration, (dict) [https://console.firebase.google.com > Settings > General > Web JS SDK].
firebase_js={},
#
# Stripe.
# enable strip.e
stripe_enabled=True,
# your stripe secret key (str) [https://stripe.com > Dashboard > Developer > API Keys > Secret Key].
stripe_secret_key=None,
# your stripe publishable key (str) [https://stripe.com > Dashboard > Developer > API Keys > Secret Key].
stripe_publishable_key=None,
# the stripe subscriptions.
# do not edit the plan & product names after creation.
# price changes are not supported yet, will be in the future.
stripe_subscriptions={
#"vserver": {
# "basic": {
# "rank":1,
# "price":50,
# "currency":"eur",
# "favicon":"https://raw.githubusercontent.com/vandenberghinc/public-storage/master/vserver/icon/icon.png"
# },
# "premium": {
# "rank":2,
# "price":100,
# "currency":"eur",
# },
# "pro": {
# "rank":3,
# "price":250,
# "currency":"eur",
# },
#}
},
# the stripe products.
stripe_products={
#"vserver": {
# "basic": {
# "rank":1,
# "price":50,
# "currency":"eur",
# "favicon":"https://raw.githubusercontent.com/vandenberghinc/public-storage/master/vserver/icon/icon.png"
# },
# "premium": {
# "rank":2,
# "price":100,
# "currency":"eur",
# },
# "pro": {
# "rank":3,
# "price":250,
# "currency":"eur",
# },
#}
},
#
#
# Smtp Email
# sending emails [https://gmail.com > Security > Enable Unsafe 3th party applications / generate an app password (advised)].
email_enabled=True,
email_address=None,
email_password=None,
email_smtp_host="smtp.gmail.com",
email_smtp_port=587,
#
# VPS.
# the public ip of the vps.
vps_ip=None,
# the vps ssh port.
vps_port=22,
# the executing username on the vps.
vps_username=None,
#
# Additional Options.
# prevent heroku deployment.
prevent_heroku_deployment=False,
# purchase tls/ssl certificate from namecheap.
purchase_tls_certificate=False,
# interactive mode.
interactive=False,
# production mode.
production=True,
# debug mode.
debug=False,
# the users sub path.
users_subpath="users/",
# id users by username.
id_by_username=True,
#
# the logs.
log_level=dev0s.defaults.options.log_level,
# styling options.
styling={},
#
#
# optionally initizialize from a serialized dict (for config.py) (still requires parameters: root).
serialized=None, )
# call website.initialize.
response = website.initialize()
# call website.cli.
_ = website.cli()
# call website.deploy.
response = website.deploy(code_update=False, reinstall=False, log_level=0)
# call website.check_dns.
response = website.check_dns(log_level=0)
# call website.create.
response = website.create()
# call website.serialize.
_ = website.serialize(save=False)
# call website.init_from_serialized.
_ = website.init_from_serialized(serialized=None)
The rate_limit object class.
# import the website.ratelimit object class.
import w3bsite
# call rate_limit.increment.
response = rate_limit.increment(
# user identification options (select one option):
# option 1: user email.
email=None,
username=None,
# option 2: the requests ip.
ip=None,
# rate lmit mode id.
mode=None,
# the increment count.
count=1, )
# call rate_limit.verify.
response = rate_limit.verify(
# user identification options (select one option):
# option 1: user email.
email=None,
username=None,
# option 2: the requests ip.
ip=None,
# rate lmit mode id.
mode=None,
# rate limit.
limit=1000,
# reset after.
reset_minutes=3600*24,
# increment on succes.
increment=False,
increment_count=1, )
The metrics object class.
# import the website.metrics object class.
import w3bsite
# call metrics.clean.
response = metrics.clean()
# call metrics.requests.
response = metrics.requests()
# call metrics.auth_requests.
response = metrics.auth_requests()
# call metrics.disk_space.
response = metrics.disk_space(mode="GB")
# call metrics.create_pie_graph.
_ = metrics.create_pie_graph(
# the data.
data={
"Used (GB)":15,
"Free (GB)":3,
},
# the key's colors.
colors={
"Used (GB)": "#FD304E",
"Free (GB)": "#323B8390",
},
# the keys to keep.
keep=["*"],
# fill background color.
fill=False, )
# call metrics.create_line_graph.
_ = metrics.create_line_graph(
# the data.
data={
"$timestamp":{
"active":10,
"non_active":3,
},
},
# the key's colors.
colors={
"active":"#323B83",
"non_active":"#FD304E",
},
# the keys to keep.
keep=["*"],
# fill background color.
fill=False, )
# call metrics.count_api_request.
_ = metrics.count_api_request(request, data={})
# call metrics.count_web_request.
_ = metrics.count_web_request(request, data={})
# call metrics.count_auth_request.
_ = metrics.count_auth_request(request, data={})
# call metrics.count_request.
response = metrics.count_request(request, id=None, data={"url":None}, save=False)
The email object class.
# import the website.users.email object class.
import w3bsite
# call email.login.
response = email.login(timeout=3)
# call email.send.
response = email.send(
# the email's subject.
subject="Subject.",
# define either html or html_path.
html=None,
html_path=None,
# the email's recipients.
recipients=[],
# optional attachments.
attachments=[], )