Add hosting app
This commit is contained in:
parent
1be7852e6a
commit
f279db6fe0
72 changed files with 4331 additions and 7949 deletions
41
hosting/README-opennebula-integration.md
Executable file
41
hosting/README-opennebula-integration.md
Executable file
|
@ -0,0 +1,41 @@
|
|||
Here are the steps to follow for running opennebula-integration correctly.
|
||||
|
||||
1. Install [python-oca](https://github.com/python-oca/python-oca)
|
||||
This is the library that allows sending XMLRPC commands to OpenNebula. Unfortunately, the latest version of oca available in Python package index is not compatible with python 3.5. Hence, one would need to download the latest version from the above github link and install it from there.
|
||||
Assuming virtualenv is located at ~/python/env
|
||||
|
||||
```
|
||||
~/python/env/bin/python setup.py build
|
||||
sudo ~/python/env/bin/python setup.py install
|
||||
```
|
||||
|
||||
2. Setup opennebula parameters in the `.env` file.
|
||||
|
||||
```
|
||||
#############################################
|
||||
# configurations for opennebula-integration #
|
||||
#############################################
|
||||
|
||||
# The oneadmin user name of the OpenNebula infrastructure
|
||||
OPENNEBULA_USERNAME='oneadmin'
|
||||
|
||||
# The oneadmin password of the OpenNebula infrastructure
|
||||
# The default credentials of the Sandbox OpenNebula VM is
|
||||
# oneadmin:opennebula
|
||||
OPENNEBULA_PASSWORD='opennebula'
|
||||
|
||||
# The protocol is generally http or https
|
||||
OPENNEBULA_PROTOCOL='http'
|
||||
|
||||
# The ip address or the domain name of the opennebula infrastructure
|
||||
OPENNEBULA_DOMAIN='192.168.182.124'
|
||||
|
||||
# The port to connect in order to send an xmlrpc request. The default
|
||||
# port is 2633
|
||||
OPENNEBULA_PORT='2633'
|
||||
|
||||
# The endpoint to which the XML RPC request needs to be sent to. The
|
||||
# default value is /RPC2
|
||||
OPENNEBULA_ENDPOINT='/RPC2'
|
||||
```
|
||||
|
7
hosting/admin.py
Normal file → Executable file
7
hosting/admin.py
Normal file → Executable file
|
@ -1,3 +1,8 @@
|
|||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
from .models import HostingOrder, HostingBill, HostingPlan, GenericProduct
|
||||
|
||||
admin.site.register(HostingOrder)
|
||||
admin.site.register(HostingBill)
|
||||
admin.site.register(HostingPlan)
|
||||
admin.site.register(GenericProduct)
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class HostingConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'hosting'
|
|
@ -1,32 +0,0 @@
|
|||
from django.conf import settings
|
||||
|
||||
|
||||
def google_analytics(request):
|
||||
"""
|
||||
Use the variables returned in this function to
|
||||
render your Google Analytics tracking code template.
|
||||
|
||||
Also check whether the site is a tenant site and create a corresponding
|
||||
variable to indicate this
|
||||
"""
|
||||
return_dict = {}
|
||||
host = request.get_host()
|
||||
if getattr(settings, 'GOOGLE_ANALYTICS_PROPERTY_IDS', False):
|
||||
ga_prop_id = getattr(settings, 'GOOGLE_ANALYTICS_PROPERTY_IDS').get(
|
||||
host)
|
||||
which_urlspy = settings.MULTISITE_CMS_URLS.get(host)
|
||||
if ga_prop_id is None:
|
||||
# Try checking if we have a www in host, if yes we remove
|
||||
# that and check in the dict again
|
||||
if host.startswith('www.'):
|
||||
ga_prop_id = getattr(settings, 'GOOGLE_ANALYTICS_PROPERTY_IDS',
|
||||
False).get(host[4:])
|
||||
which_urlspy = settings.MULTISITE_CMS_URLS.get(host[4:])
|
||||
|
||||
if not settings.DEBUG and ga_prop_id:
|
||||
return_dict['GOOGLE_ANALYTICS_PROPERTY_ID'] = ga_prop_id
|
||||
if which_urlspy:
|
||||
if which_urlspy.endswith("multi"):
|
||||
return_dict['IS_TENANT_SITE'] = True
|
||||
|
||||
return return_dict
|
|
@ -1,256 +0,0 @@
|
|||
from django.utils.translation import gettext as _
|
||||
from django.db import models
|
||||
|
||||
# http://xml.coverpages.org/country3166.html
|
||||
COUNTRIES = (
|
||||
('AD', _('Andorra')),
|
||||
('AE', _('United Arab Emirates')),
|
||||
('AF', _('Afghanistan')),
|
||||
('AG', _('Antigua & Barbuda')),
|
||||
('AI', _('Anguilla')),
|
||||
('AL', _('Albania')),
|
||||
('AM', _('Armenia')),
|
||||
('AN', _('Netherlands Antilles')),
|
||||
('AO', _('Angola')),
|
||||
('AQ', _('Antarctica')),
|
||||
('AR', _('Argentina')),
|
||||
('AS', _('American Samoa')),
|
||||
('AT', _('Austria')),
|
||||
('AU', _('Australia')),
|
||||
('AW', _('Aruba')),
|
||||
('AZ', _('Azerbaijan')),
|
||||
('BA', _('Bosnia and Herzegovina')),
|
||||
('BB', _('Barbados')),
|
||||
('BD', _('Bangladesh')),
|
||||
('BE', _('Belgium')),
|
||||
('BF', _('Burkina Faso')),
|
||||
('BG', _('Bulgaria')),
|
||||
('BH', _('Bahrain')),
|
||||
('BI', _('Burundi')),
|
||||
('BJ', _('Benin')),
|
||||
('BM', _('Bermuda')),
|
||||
('BN', _('Brunei Darussalam')),
|
||||
('BO', _('Bolivia')),
|
||||
('BR', _('Brazil')),
|
||||
('BS', _('Bahama')),
|
||||
('BT', _('Bhutan')),
|
||||
('BV', _('Bouvet Island')),
|
||||
('BW', _('Botswana')),
|
||||
('BY', _('Belarus')),
|
||||
('BZ', _('Belize')),
|
||||
('CA', _('Canada')),
|
||||
('CC', _('Cocos (Keeling) Islands')),
|
||||
('CF', _('Central African Republic')),
|
||||
('CG', _('Congo')),
|
||||
('CH', _('Switzerland')),
|
||||
('CI', _('Ivory Coast')),
|
||||
('CK', _('Cook Iislands')),
|
||||
('CL', _('Chile')),
|
||||
('CM', _('Cameroon')),
|
||||
('CN', _('China')),
|
||||
('CO', _('Colombia')),
|
||||
('CR', _('Costa Rica')),
|
||||
('CU', _('Cuba')),
|
||||
('CV', _('Cape Verde')),
|
||||
('CX', _('Christmas Island')),
|
||||
('CY', _('Cyprus')),
|
||||
('CZ', _('Czech Republic')),
|
||||
('DE', _('Germany')),
|
||||
('DJ', _('Djibouti')),
|
||||
('DK', _('Denmark')),
|
||||
('DM', _('Dominica')),
|
||||
('DO', _('Dominican Republic')),
|
||||
('DZ', _('Algeria')),
|
||||
('EC', _('Ecuador')),
|
||||
('EE', _('Estonia')),
|
||||
('EG', _('Egypt')),
|
||||
('EH', _('Western Sahara')),
|
||||
('ER', _('Eritrea')),
|
||||
('ES', _('Spain')),
|
||||
('ET', _('Ethiopia')),
|
||||
('FI', _('Finland')),
|
||||
('FJ', _('Fiji')),
|
||||
('FK', _('Falkland Islands (Malvinas)')),
|
||||
('FM', _('Micronesia')),
|
||||
('FO', _('Faroe Islands')),
|
||||
('FR', _('France')),
|
||||
('FX', _('France, Metropolitan')),
|
||||
('GA', _('Gabon')),
|
||||
('GB', _('United Kingdom (Great Britain)')),
|
||||
('GD', _('Grenada')),
|
||||
('GE', _('Georgia')),
|
||||
('GF', _('French Guiana')),
|
||||
('GH', _('Ghana')),
|
||||
('GI', _('Gibraltar')),
|
||||
('GL', _('Greenland')),
|
||||
('GM', _('Gambia')),
|
||||
('GN', _('Guinea')),
|
||||
('GP', _('Guadeloupe')),
|
||||
('GQ', _('Equatorial Guinea')),
|
||||
('GR', _('Greece')),
|
||||
('GS', _('South Georgia and the South Sandwich Islands')),
|
||||
('GT', _('Guatemala')),
|
||||
('GU', _('Guam')),
|
||||
('GW', _('Guinea-Bissau')),
|
||||
('GY', _('Guyana')),
|
||||
('HK', _('Hong Kong')),
|
||||
('HM', _('Heard & McDonald Islands')),
|
||||
('HN', _('Honduras')),
|
||||
('HR', _('Croatia')),
|
||||
('HT', _('Haiti')),
|
||||
('HU', _('Hungary')),
|
||||
('ID', _('Indonesia')),
|
||||
('IE', _('Ireland')),
|
||||
('IL', _('Israel')),
|
||||
('IN', _('India')),
|
||||
('IO', _('British Indian Ocean Territory')),
|
||||
('IQ', _('Iraq')),
|
||||
('IR', _('Islamic Republic of Iran')),
|
||||
('IS', _('Iceland')),
|
||||
('IT', _('Italy')),
|
||||
('JM', _('Jamaica')),
|
||||
('JO', _('Jordan')),
|
||||
('JP', _('Japan')),
|
||||
('KE', _('Kenya')),
|
||||
('KG', _('Kyrgyzstan')),
|
||||
('KH', _('Cambodia')),
|
||||
('KI', _('Kiribati')),
|
||||
('KM', _('Comoros')),
|
||||
('KN', _('St. Kitts and Nevis')),
|
||||
('KP', _('Korea, Democratic People\'s Republic of')),
|
||||
('KR', _('Korea, Republic of')),
|
||||
('KW', _('Kuwait')),
|
||||
('KY', _('Cayman Islands')),
|
||||
('KZ', _('Kazakhstan')),
|
||||
('LA', _('Lao People\'s Democratic Republic')),
|
||||
('LB', _('Lebanon')),
|
||||
('LC', _('Saint Lucia')),
|
||||
('LI', _('Liechtenstein')),
|
||||
('LK', _('Sri Lanka')),
|
||||
('LR', _('Liberia')),
|
||||
('LS', _('Lesotho')),
|
||||
('LT', _('Lithuania')),
|
||||
('LU', _('Luxembourg')),
|
||||
('LV', _('Latvia')),
|
||||
('LY', _('Libyan Arab Jamahiriya')),
|
||||
('MA', _('Morocco')),
|
||||
('MC', _('Monaco')),
|
||||
('MD', _('Moldova, Republic of')),
|
||||
('MG', _('Madagascar')),
|
||||
('MH', _('Marshall Islands')),
|
||||
('ML', _('Mali')),
|
||||
('MN', _('Mongolia')),
|
||||
('MM', _('Myanmar')),
|
||||
('MO', _('Macau')),
|
||||
('MP', _('Northern Mariana Islands')),
|
||||
('MQ', _('Martinique')),
|
||||
('MR', _('Mauritania')),
|
||||
('MS', _('Monserrat')),
|
||||
('MT', _('Malta')),
|
||||
('MU', _('Mauritius')),
|
||||
('MV', _('Maldives')),
|
||||
('MW', _('Malawi')),
|
||||
('MX', _('Mexico')),
|
||||
('MY', _('Malaysia')),
|
||||
('MZ', _('Mozambique')),
|
||||
('NA', _('Namibia')),
|
||||
('NC', _('New Caledonia')),
|
||||
('NE', _('Niger')),
|
||||
('NF', _('Norfolk Island')),
|
||||
('NG', _('Nigeria')),
|
||||
('NI', _('Nicaragua')),
|
||||
('NL', _('Netherlands')),
|
||||
('NO', _('Norway')),
|
||||
('NP', _('Nepal')),
|
||||
('NR', _('Nauru')),
|
||||
('NU', _('Niue')),
|
||||
('NZ', _('New Zealand')),
|
||||
('OM', _('Oman')),
|
||||
('PA', _('Panama')),
|
||||
('PE', _('Peru')),
|
||||
('PF', _('French Polynesia')),
|
||||
('PG', _('Papua New Guinea')),
|
||||
('PH', _('Philippines')),
|
||||
('PK', _('Pakistan')),
|
||||
('PL', _('Poland')),
|
||||
('PM', _('St. Pierre & Miquelon')),
|
||||
('PN', _('Pitcairn')),
|
||||
('PR', _('Puerto Rico')),
|
||||
('PT', _('Portugal')),
|
||||
('PW', _('Palau')),
|
||||
('PY', _('Paraguay')),
|
||||
('QA', _('Qatar')),
|
||||
('RE', _('Reunion')),
|
||||
('RO', _('Romania')),
|
||||
('RU', _('Russian Federation')),
|
||||
('RW', _('Rwanda')),
|
||||
('SA', _('Saudi Arabia')),
|
||||
('SB', _('Solomon Islands')),
|
||||
('SC', _('Seychelles')),
|
||||
('SD', _('Sudan')),
|
||||
('SE', _('Sweden')),
|
||||
('SG', _('Singapore')),
|
||||
('SH', _('St. Helena')),
|
||||
('SI', _('Slovenia')),
|
||||
('SJ', _('Svalbard & Jan Mayen Islands')),
|
||||
('SK', _('Slovakia')),
|
||||
('SL', _('Sierra Leone')),
|
||||
('SM', _('San Marino')),
|
||||
('SN', _('Senegal')),
|
||||
('SO', _('Somalia')),
|
||||
('SR', _('Suriname')),
|
||||
('ST', _('Sao Tome & Principe')),
|
||||
('SV', _('El Salvador')),
|
||||
('SY', _('Syrian Arab Republic')),
|
||||
('SZ', _('Swaziland')),
|
||||
('TC', _('Turks & Caicos Islands')),
|
||||
('TD', _('Chad')),
|
||||
('TF', _('French Southern Territories')),
|
||||
('TG', _('Togo')),
|
||||
('TH', _('Thailand')),
|
||||
('TJ', _('Tajikistan')),
|
||||
('TK', _('Tokelau')),
|
||||
('TM', _('Turkmenistan')),
|
||||
('TN', _('Tunisia')),
|
||||
('TO', _('Tonga')),
|
||||
('TP', _('East Timor')),
|
||||
('TR', _('Turkey')),
|
||||
('TT', _('Trinidad & Tobago')),
|
||||
('TV', _('Tuvalu')),
|
||||
('TW', _('Taiwan, Province of China')),
|
||||
('TZ', _('Tanzania, United Republic of')),
|
||||
('UA', _('Ukraine')),
|
||||
('UG', _('Uganda')),
|
||||
('UM', _('United States Minor Outlying Islands')),
|
||||
('US', _('United States of America')),
|
||||
('UY', _('Uruguay')),
|
||||
('UZ', _('Uzbekistan')),
|
||||
('VA', _('Vatican City State (Holy See)')),
|
||||
('VC', _('St. Vincent & the Grenadines')),
|
||||
('VE', _('Venezuela')),
|
||||
('VG', _('British Virgin Islands')),
|
||||
('VI', _('United States Virgin Islands')),
|
||||
('VN', _('Viet Nam')),
|
||||
('VU', _('Vanuatu')),
|
||||
('WF', _('Wallis & Futuna Islands')),
|
||||
('WS', _('Samoa')),
|
||||
('YE', _('Yemen')),
|
||||
('YT', _('Mayotte')),
|
||||
('YU', _('Yugoslavia')),
|
||||
('ZA', _('South Africa')),
|
||||
('ZM', _('Zambia')),
|
||||
('ZR', _('Zaire')),
|
||||
('ZW', _('Zimbabwe')),
|
||||
)
|
||||
|
||||
|
||||
class CountryField(models.CharField):
|
||||
def __init__(self, *args, **kwargs):
|
||||
kwargs.setdefault('choices', COUNTRIES)
|
||||
kwargs.setdefault('default', 'CH')
|
||||
kwargs.setdefault('max_length', 2)
|
||||
|
||||
super(CountryField, self).__init__(*args, **kwargs)
|
||||
|
||||
def get_internal_type(self):
|
||||
return "CharField"
|
144
hosting/forms.py
Normal file → Executable file
144
hosting/forms.py
Normal file → Executable file
|
@ -1,155 +1,20 @@
|
|||
from django import forms
|
||||
|
||||
from .models import CustomUser, BillingAddress, UserBillingAddress
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
import datetime
|
||||
import html
|
||||
import logging
|
||||
import subprocess
|
||||
import tempfile
|
||||
import xml
|
||||
|
||||
from django import forms
|
||||
from django.conf import settings
|
||||
from django.contrib.auth import authenticate
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from .models import CustomUser
|
||||
from membership.models import CustomUser
|
||||
from .models import UserHostingKey, GenericProduct
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ResendActivationEmailForm(forms.Form):
|
||||
email = forms.CharField(widget=forms.EmailInput())
|
||||
|
||||
class Meta:
|
||||
fields = ['email']
|
||||
|
||||
def clean_email(self):
|
||||
email = self.cleaned_data.get('email')
|
||||
try:
|
||||
c = CustomUser.objects.get(email=email)
|
||||
if c.validated == 1:
|
||||
raise forms.ValidationError(
|
||||
_("The account is already active."))
|
||||
return email
|
||||
except CustomUser.DoesNotExist:
|
||||
raise forms.ValidationError(_("User does not exist"))
|
||||
|
||||
|
||||
class PasswordResetRequestForm(forms.Form):
|
||||
email = forms.CharField(widget=forms.EmailInput())
|
||||
|
||||
class Meta:
|
||||
fields = ['email']
|
||||
|
||||
def clean_email(self):
|
||||
email = self.cleaned_data.get('email')
|
||||
try:
|
||||
CustomUser.objects.get(email=email)
|
||||
return email
|
||||
except CustomUser.DoesNotExist:
|
||||
raise forms.ValidationError(_("User does not exist"))
|
||||
|
||||
|
||||
class SetPasswordForm(forms.Form):
|
||||
"""
|
||||
A form that lets a user change set their password without entering the old
|
||||
password
|
||||
"""
|
||||
error_messages = {
|
||||
'password_mismatch': _("The two password fields didn't match."),
|
||||
}
|
||||
new_password1 = forms.CharField(label=_("New password"),
|
||||
widget=forms.PasswordInput)
|
||||
new_password2 = forms.CharField(label=_("New password confirmation"),
|
||||
widget=forms.PasswordInput)
|
||||
|
||||
def clean_new_password2(self):
|
||||
password1 = self.cleaned_data.get('new_password1')
|
||||
password2 = self.cleaned_data.get('new_password2')
|
||||
if password1 and password2:
|
||||
if password1 != password2:
|
||||
raise forms.ValidationError(
|
||||
self.error_messages['password_mismatch'],
|
||||
code='password_mismatch', )
|
||||
return password2
|
||||
|
||||
|
||||
class EditCreditCardForm(forms.Form):
|
||||
token = forms.CharField(widget=forms.HiddenInput())
|
||||
|
||||
|
||||
class BillingAddressForm(forms.ModelForm):
|
||||
token = forms.CharField(widget=forms.HiddenInput(), required=False)
|
||||
card = forms.CharField(widget=forms.HiddenInput(), required=False)
|
||||
|
||||
class Meta:
|
||||
model = BillingAddress
|
||||
fields = ['cardholder_name', 'street_address',
|
||||
'city', 'postal_code', 'country', 'vat_number']
|
||||
labels = {
|
||||
'cardholder_name': _('Cardholder Name'),
|
||||
'street_address': _('Street Address'),
|
||||
'city': _('City'),
|
||||
'postal_code': _('Postal Code'),
|
||||
'Country': _('Country'),
|
||||
'VAT Number': _('VAT Number')
|
||||
}
|
||||
|
||||
|
||||
class BillingAddressFormSignup(BillingAddressForm):
|
||||
name = forms.CharField(label=_('Name'))
|
||||
email = forms.EmailField(label=_('Email Address'))
|
||||
field_order = ['name', 'email']
|
||||
|
||||
class Meta:
|
||||
model = BillingAddress
|
||||
fields = ['name', 'email', 'cardholder_name', 'street_address',
|
||||
'city', 'postal_code', 'country', 'vat_number']
|
||||
labels = {
|
||||
'name': 'Name',
|
||||
'email': _('Email'),
|
||||
'cardholder_name': _('Cardholder Name'),
|
||||
'street_address': _('Street Address'),
|
||||
'city': _('City'),
|
||||
'postal_code': _('Postal Code'),
|
||||
'Country': _('Country'),
|
||||
'vat_number': _('VAT Number')
|
||||
}
|
||||
|
||||
def clean_email(self):
|
||||
email = self.cleaned_data.get('email')
|
||||
try:
|
||||
CustomUser.objects.get(email=email)
|
||||
raise forms.ValidationError(
|
||||
_("The email %(email)s is already registered with us. "
|
||||
"Please reset your password and access your account.") %
|
||||
{'email': email}
|
||||
)
|
||||
except CustomUser.DoesNotExist:
|
||||
return email
|
||||
|
||||
|
||||
class UserBillingAddressForm(forms.ModelForm):
|
||||
user = forms.ModelChoiceField(queryset=CustomUser.objects.all(),
|
||||
widget=forms.HiddenInput())
|
||||
|
||||
class Meta:
|
||||
model = UserBillingAddress
|
||||
fields = ['cardholder_name', 'street_address',
|
||||
'city', 'postal_code', 'country', 'user', 'vat_number']
|
||||
labels = {
|
||||
'cardholder_name': _('Cardholder Name'),
|
||||
'street_address': _('Street Building'),
|
||||
'city': _('City'),
|
||||
'postal_code': _('Postal Code'),
|
||||
'Country': _('Country'),
|
||||
'vat_number': _('VAT Number'),
|
||||
}
|
||||
|
||||
|
||||
|
||||
def generate_ssh_key_name():
|
||||
return '{prefix}{date_time_str}'.format(
|
||||
prefix=settings.DCL_SSH_KEY_NAME_PREFIX,
|
||||
|
@ -343,7 +208,7 @@ class UserHostingKeyForm(forms.ModelForm):
|
|||
logger.debug(
|
||||
"Not a correct ssh format {error}".format(error=str(cpe)))
|
||||
raise forms.ValidationError(KEY_ERROR_MESSAGE)
|
||||
return xml.sax.saxutils.escape(openssh_pubkey_str)
|
||||
return html.escape(openssh_pubkey_str)
|
||||
|
||||
def clean_name(self):
|
||||
INVALID_NAME_MESSAGE = _("Comma not accepted in the name of the key")
|
||||
|
@ -353,7 +218,7 @@ class UserHostingKeyForm(forms.ModelForm):
|
|||
return self.data.get('name')
|
||||
|
||||
def clean_user(self):
|
||||
return self.request.user if self.request.user.is_authenticated else None
|
||||
return self.request.user if self.request.user.is_authenticated() else None
|
||||
|
||||
def clean(self):
|
||||
cleaned_data = self.cleaned_data
|
||||
|
@ -370,4 +235,3 @@ class UserHostingKeyForm(forms.ModelForm):
|
|||
class Meta:
|
||||
model = UserHostingKey
|
||||
fields = ['user', 'name', 'public_key']
|
||||
|
||||
|
|
BIN
hosting/locale/de/LC_MESSAGES/django.mo
Executable file
BIN
hosting/locale/de/LC_MESSAGES/django.mo
Executable file
Binary file not shown.
1472
hosting/locale/de/LC_MESSAGES/django.po
Executable file
1472
hosting/locale/de/LC_MESSAGES/django.po
Executable file
File diff suppressed because it is too large
Load diff
|
@ -1,31 +0,0 @@
|
|||
# import six
|
||||
from django.core.mail import send_mail
|
||||
from django.core.mail import EmailMultiAlternatives
|
||||
from django.template.loader import render_to_string
|
||||
|
||||
|
||||
from django.conf import settings
|
||||
|
||||
|
||||
class BaseEmail(object):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.to = kwargs.get('to')
|
||||
self.template_name = kwargs.get('template_name')
|
||||
self.template_path = kwargs.get('template_path')
|
||||
self.subject = kwargs.get('subject')
|
||||
self.context = kwargs.get('context', {})
|
||||
self.template_full_path = '%s%s' % (self.template_path, self.template_name)
|
||||
text_content = render_to_string('%s.txt' % self.template_full_path, self.context)
|
||||
html_content = render_to_string('%s.html' % self.template_full_path, self.context)
|
||||
|
||||
self.email = EmailMultiAlternatives(self.subject, text_content)
|
||||
self.email.attach_alternative(html_content, "text/html")
|
||||
if 'from_address' in kwargs:
|
||||
self.email.from_email = kwargs.get('from_address')
|
||||
else:
|
||||
self.email.from_email = '(ungleich) ungleich Support <info@ungleich.ch>'
|
||||
self.email.to = [kwargs.get('to', 'info@ungleich.ch')]
|
||||
|
||||
def send(self):
|
||||
self.email.send()
|
0
hosting/templatetags/__init__.py → hosting/management/__init__.py
Normal file → Executable file
0
hosting/templatetags/__init__.py → hosting/management/__init__.py
Normal file → Executable file
0
hosting/management/commands/__init__.py
Executable file
0
hosting/management/commands/__init__.py
Executable file
106
hosting/management/commands/create_vm_types.py
Executable file
106
hosting/management/commands/create_vm_types.py
Executable file
|
@ -0,0 +1,106 @@
|
|||
from django.core.management.base import BaseCommand
|
||||
from hosting.models import VirtualMachineType
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'Create VM types'
|
||||
|
||||
def get_data(self):
|
||||
|
||||
return [
|
||||
{
|
||||
'base_price': 10,
|
||||
'core_price': 5,
|
||||
'memory_price': 2,
|
||||
'disk_size_price': 0.6,
|
||||
'cores': 1,
|
||||
'memory': 2,
|
||||
'disk_size': 10
|
||||
},
|
||||
{
|
||||
'base_price': 10,
|
||||
'core_price': 5,
|
||||
'memory_price': 2,
|
||||
'disk_size_price': 0.6,
|
||||
'cores': 1,
|
||||
'memory': 2,
|
||||
'disk_size': 100
|
||||
},
|
||||
{
|
||||
'base_price': 10,
|
||||
'core_price': 5,
|
||||
'memory_price': 2,
|
||||
'disk_size_price': 0.6,
|
||||
'cores': 2,
|
||||
'memory': 4,
|
||||
'disk_size': 20
|
||||
},
|
||||
{
|
||||
'base_price': 10,
|
||||
'core_price': 5,
|
||||
'memory_price': 2,
|
||||
'disk_size_price': 0.6,
|
||||
'cores': 4,
|
||||
'memory': 8,
|
||||
'disk_size': 40
|
||||
},
|
||||
{
|
||||
'base_price': 10,
|
||||
'core_price': 5,
|
||||
'memory_price': 2,
|
||||
'disk_size_price': 0.6,
|
||||
'cores': 16,
|
||||
'memory': 8,
|
||||
'disk_size': 40
|
||||
},
|
||||
]
|
||||
|
||||
# not used
|
||||
# hetzner = {
|
||||
# 'base_price': 10,
|
||||
# 'core_price': 5,
|
||||
# 'memory_price': 2,
|
||||
# 'disk_size_price': 0.6,
|
||||
# 'description': 'VM auf einzelner HW, Raid1, kein HA',
|
||||
# 'location': 'DE'
|
||||
# }
|
||||
|
||||
# return {
|
||||
# # 'hetzner_nug': {
|
||||
# # 'base_price': 5,
|
||||
# # 'memory_price': 2,
|
||||
# # 'core_price': 2,
|
||||
# # 'disk_size_price': 0.5,
|
||||
# # 'description': 'VM ohne Uptime Garantie'
|
||||
# # },
|
||||
# 'hetzner': hetzner,
|
||||
# # 'hetzner_raid6': {
|
||||
# # 'base_price': hetzner['base_price']*1.2,
|
||||
# # 'core_price': hetzner['core_price']*1.2,
|
||||
# # 'memory_price': hetzner['memory_price']*1.2,
|
||||
# # 'disk_size_price': hetzner['disk_size_price']*1.2,
|
||||
# # 'description': 'VM auf einzelner HW, Raid1, kein HA'
|
||||
|
||||
# # },
|
||||
# # 'hetzner_glusterfs': {
|
||||
# # 'base_price': hetzner['base_price']*1.4,
|
||||
# # 'core_price': hetzner['core_price']*1.4,
|
||||
# # 'memory_price': hetzner['memory_price']*1.4,
|
||||
# # 'disk_size_price': hetzner['disk_size_price']*1.4,
|
||||
# # 'description': 'VM auf einzelner HW, Raid1, kein HA'
|
||||
# # },
|
||||
# 'bern': {
|
||||
# 'base_price': 12,
|
||||
# 'core_price': 25,
|
||||
# 'memory_price': 7,
|
||||
# 'disk_size_price': 0.70,
|
||||
# 'description': "VM in Bern, HA Setup ohne HA Garantie",
|
||||
# 'location': 'CH',
|
||||
# }
|
||||
# }
|
||||
|
||||
def handle(self, *args, **options):
|
||||
|
||||
vm_data = self.get_data()
|
||||
for vm in vm_data:
|
||||
VirtualMachineType.objects.create(**vm)
|
81
hosting/management/commands/fetch_stripe_bills.py
Executable file
81
hosting/management/commands/fetch_stripe_bills.py
Executable file
|
@ -0,0 +1,81 @@
|
|||
import datetime
|
||||
import logging
|
||||
|
||||
from django.core.management.base import BaseCommand
|
||||
|
||||
from hosting.models import MonthlyHostingBill
|
||||
from membership.models import CustomUser
|
||||
from utils.stripe_utils import StripeUtils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = '''Fetches invoices from Stripe and creates bills for a given
|
||||
customer in the MonthlyHostingBill model'''
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument('customer_email', nargs='+', type=str)
|
||||
|
||||
def handle(self, *args, **options):
|
||||
try:
|
||||
for email in options['customer_email']:
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(
|
||||
"---------------------------------------------")
|
||||
)
|
||||
stripe_utils = StripeUtils()
|
||||
user = CustomUser.objects.get(email=email)
|
||||
if hasattr(user, 'stripecustomer'):
|
||||
self.stdout.write(self.style.SUCCESS(
|
||||
'Found %s. Fetching bills for him.' % email))
|
||||
mhb = MonthlyHostingBill.objects.filter(
|
||||
customer=user.stripecustomer).last()
|
||||
created_gt = {}
|
||||
if mhb is not None:
|
||||
# fetch only invoices which is created after
|
||||
# mhb.created, because we already have invoices till
|
||||
# this date
|
||||
created_gt = int(mhb.created.timestamp())
|
||||
|
||||
all_invoices_response = stripe_utils.get_all_invoices(
|
||||
user.stripecustomer.stripe_id,
|
||||
created_gt=created_gt
|
||||
)
|
||||
if all_invoices_response['error'] is not None:
|
||||
self.stdout.write(self.style.ERROR(all_invoices_response['error']))
|
||||
user.import_stripe_bill_remark += "{}: {},".format(datetime.datetime.now(), all_invoices_response['error'])
|
||||
user.save()
|
||||
continue
|
||||
all_invoices = all_invoices_response['response_object']
|
||||
self.stdout.write(self.style.SUCCESS("Obtained {} invoices".format(len(all_invoices) if all_invoices is not None else 0)))
|
||||
num_invoice_created = 0
|
||||
for invoice in all_invoices:
|
||||
invoice['customer'] = user.stripecustomer
|
||||
try:
|
||||
existing_mhb = MonthlyHostingBill.objects.get(invoice_id=invoice['invoice_id'])
|
||||
logger.debug("Invoice %s exists already. Not importing." % invoice['invoice_id'])
|
||||
except MonthlyHostingBill.DoesNotExist as dne:
|
||||
logger.debug("Invoice id %s does not exist" % invoice['invoice_id'])
|
||||
|
||||
if MonthlyHostingBill.create(invoice) is not None:
|
||||
num_invoice_created += 1
|
||||
else:
|
||||
user.import_stripe_bill_remark += "{}: Import failed - {},".format(
|
||||
datetime.datetime.now(),
|
||||
invoice['invoice_id'])
|
||||
user.save()
|
||||
logger.error("Did not import invoice for %s"
|
||||
"" % str(invoice))
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS("Number of invoices imported = %s" % num_invoice_created)
|
||||
)
|
||||
else:
|
||||
self.stdout.write(self.style.SUCCESS(
|
||||
'Customer email %s does not have a stripe customer.' % email))
|
||||
user.import_stripe_bill_remark += "{}: No stripecustomer,".format(
|
||||
datetime.datetime.now()
|
||||
)
|
||||
user.save()
|
||||
except Exception as e:
|
||||
print(" *** Error occurred. Details {}".format(str(e)))
|
45
hosting/management/commands/import_usercarddetails.py
Executable file
45
hosting/management/commands/import_usercarddetails.py
Executable file
|
@ -0,0 +1,45 @@
|
|||
from django.core.management.base import BaseCommand
|
||||
|
||||
from hosting.models import UserCardDetail
|
||||
from membership.models import CustomUser
|
||||
from utils.stripe_utils import StripeUtils
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = '''Imports the usercard details of all customers. Created just for
|
||||
multiple card support.'''
|
||||
|
||||
def handle(self, *args, **options):
|
||||
try:
|
||||
stripe_utils = StripeUtils()
|
||||
for user in CustomUser.objects.all():
|
||||
if hasattr(user, 'stripecustomer'):
|
||||
if user.stripecustomer:
|
||||
card_details_resp = stripe_utils.get_card_details(
|
||||
user.stripecustomer.stripe_id
|
||||
)
|
||||
card_details = card_details_resp['response_object']
|
||||
if card_details:
|
||||
ucd = UserCardDetail.get_or_create_user_card_detail(
|
||||
stripe_customer=user.stripecustomer,
|
||||
card_details=card_details
|
||||
)
|
||||
UserCardDetail.save_default_card_local(
|
||||
user.stripecustomer.stripe_id,
|
||||
ucd.card_id
|
||||
)
|
||||
print("Saved user card details for {}".format(
|
||||
user.email
|
||||
))
|
||||
else:
|
||||
print(" --- Could not get card details for "
|
||||
"{}".format(user.email))
|
||||
print(" --- Error: {}".format(
|
||||
card_details_resp['error']
|
||||
))
|
||||
else:
|
||||
print(" === {} does not have a StripeCustomer object".format(
|
||||
user.email
|
||||
))
|
||||
except Exception as e:
|
||||
print(" *** Error occurred. Details {}".format(str(e)))
|
44
hosting/management/commands/import_vat_rates.py
Executable file
44
hosting/management/commands/import_vat_rates.py
Executable file
|
@ -0,0 +1,44 @@
|
|||
from django.core.management.base import BaseCommand
|
||||
import csv
|
||||
from hosting.models import VATRates
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = '''Imports VAT Rates. Assume vat rates of format https://github.com/kdeldycke/vat-rates/blob/master/vat_rates.csv'''
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument('csv_file', nargs='+', type=str)
|
||||
|
||||
def handle(self, *args, **options):
|
||||
try:
|
||||
for c_file in options['csv_file']:
|
||||
print("c_file = %s" % c_file)
|
||||
with open(c_file, mode='r') as csv_file:
|
||||
csv_reader = csv.DictReader(csv_file)
|
||||
line_count = 0
|
||||
for row in csv_reader:
|
||||
if line_count == 0:
|
||||
line_count += 1
|
||||
obj, created = VATRates.objects.get_or_create(
|
||||
start_date=row["start_date"],
|
||||
stop_date=row["stop_date"] if row["stop_date"] is not "" else None,
|
||||
territory_codes=row["territory_codes"],
|
||||
currency_code=row["currency_code"],
|
||||
rate=row["rate"],
|
||||
rate_type=row["rate_type"],
|
||||
description=row["description"]
|
||||
)
|
||||
if created:
|
||||
self.stdout.write(self.style.SUCCESS(
|
||||
'%s. %s - %s - %s - %s' % (
|
||||
line_count,
|
||||
obj.start_date,
|
||||
obj.stop_date,
|
||||
obj.territory_codes,
|
||||
obj.rate
|
||||
)
|
||||
))
|
||||
line_count+=1
|
||||
|
||||
except Exception as e:
|
||||
print(" *** Error occurred. Details {}".format(str(e)))
|
9
hosting/managers.py
Executable file
9
hosting/managers.py
Executable file
|
@ -0,0 +1,9 @@
|
|||
from django.db import models
|
||||
|
||||
|
||||
class VMPlansManager(models.Manager):
|
||||
|
||||
def active(self, user, **kwargs):
|
||||
return self.prefetch_related('hosting_orders__customer__user').\
|
||||
filter(hosting_orders__customer__user=user, hosting_orders__approved=True, **kwargs)\
|
||||
.distinct()
|
261
hosting/migrations/0001_initial.py
Normal file
261
hosting/migrations/0001_initial.py
Normal file
|
@ -0,0 +1,261 @@
|
|||
# Generated by Django 4.2.7 on 2023-12-02 12:45
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import utils.mixins
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('membership', '__first__'),
|
||||
('utils', '__first__'),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('datacenterlight', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='GenericProduct',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('product_name', models.CharField(default='', max_length=128)),
|
||||
('product_slug', models.SlugField(help_text='An mandatory unique slug for the product', unique=True)),
|
||||
('product_description', models.CharField(default='', max_length=500)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('product_price', models.DecimalField(decimal_places=2, max_digits=6)),
|
||||
('product_vat', models.DecimalField(decimal_places=4, default=0, max_digits=6)),
|
||||
('product_is_subscription', models.BooleanField(default=True)),
|
||||
('product_subscription_interval', models.CharField(default='month', help_text='Choose between `year` and `month`', max_length=10)),
|
||||
('exclude_vat_calculations', models.BooleanField(default=False, help_text='When checked VAT calculations are excluded for this product')),
|
||||
],
|
||||
bases=(utils.mixins.AssignPermissionsMixin, models.Model),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='HostingOrder',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('vm_id', models.IntegerField(default=0)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('approved', models.BooleanField(default=False)),
|
||||
('last4', models.CharField(max_length=4)),
|
||||
('cc_brand', models.CharField(max_length=128)),
|
||||
('stripe_charge_id', models.CharField(max_length=100, null=True)),
|
||||
('price', models.FloatField()),
|
||||
('subscription_id', models.CharField(max_length=100, null=True)),
|
||||
('generic_payment_description', models.CharField(max_length=500, null=True)),
|
||||
('billing_address', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='utils.billingaddress')),
|
||||
('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='membership.stripecustomer')),
|
||||
('generic_product', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='hosting.genericproduct')),
|
||||
],
|
||||
options={
|
||||
'permissions': (('pr_view_hostingorder', 'View Hosting Order'),),
|
||||
},
|
||||
bases=(utils.mixins.AssignPermissionsMixin, models.Model),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='HostingPlan',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('disk_size', models.FloatField(default=0.0)),
|
||||
('cpu_cores', models.FloatField(default=0.0)),
|
||||
('memory', models.FloatField(default=0.0)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='IncompletePaymentIntents',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('completed_at', models.DateTimeField(null=True)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('payment_intent_id', models.CharField(max_length=100)),
|
||||
('request', models.TextField()),
|
||||
('stripe_api_cus_id', models.CharField(max_length=30)),
|
||||
('card_details_response', models.TextField()),
|
||||
('stripe_subscription_id', models.CharField(max_length=100, null=True)),
|
||||
('stripe_charge_id', models.CharField(max_length=100, null=True)),
|
||||
('gp_details', models.TextField()),
|
||||
('billing_address_data', models.TextField()),
|
||||
],
|
||||
bases=(utils.mixins.AssignPermissionsMixin, models.Model),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='IncompleteSubscriptions',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('completed_at', models.DateTimeField(null=True)),
|
||||
('subscription_id', models.CharField(max_length=100)),
|
||||
('subscription_status', models.CharField(max_length=30)),
|
||||
('name', models.CharField(max_length=50)),
|
||||
('email', models.EmailField(max_length=254)),
|
||||
('request', models.TextField()),
|
||||
('stripe_api_cus_id', models.CharField(max_length=30)),
|
||||
('card_details_response', models.TextField()),
|
||||
('stripe_subscription_obj', models.TextField()),
|
||||
('stripe_onetime_charge', models.TextField()),
|
||||
('gp_details', models.TextField()),
|
||||
('specs', models.TextField()),
|
||||
('vm_template_id', models.PositiveIntegerField(default=0)),
|
||||
('template', models.TextField()),
|
||||
('billing_address_data', models.TextField()),
|
||||
],
|
||||
bases=(utils.mixins.AssignPermissionsMixin, models.Model),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='StripeTaxRate',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('tax_rate_id', models.CharField(max_length=100, unique=True)),
|
||||
('jurisdiction', models.CharField(max_length=10)),
|
||||
('inclusive', models.BooleanField(default=False)),
|
||||
('display_name', models.CharField(max_length=100)),
|
||||
('percentage', models.FloatField(default=0)),
|
||||
('description', models.CharField(max_length=100)),
|
||||
],
|
||||
bases=(utils.mixins.AssignPermissionsMixin, models.Model),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='VATRates',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('start_date', models.DateField(blank=True, null=True)),
|
||||
('stop_date', models.DateField(blank=True, null=True)),
|
||||
('territory_codes', models.TextField(blank=True, default='')),
|
||||
('currency_code', models.CharField(max_length=10)),
|
||||
('rate', models.FloatField()),
|
||||
('rate_type', models.TextField(blank=True, default='')),
|
||||
('description', models.TextField(blank=True, default='')),
|
||||
],
|
||||
bases=(utils.mixins.AssignPermissionsMixin, models.Model),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='VMDetail',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('vm_id', models.IntegerField(default=0)),
|
||||
('disk_size', models.FloatField(default=0.0)),
|
||||
('cores', models.FloatField(default=0.0)),
|
||||
('memory', models.FloatField(default=0.0)),
|
||||
('configuration', models.CharField(default='', max_length=128)),
|
||||
('ipv4', models.TextField(default='')),
|
||||
('ipv6', models.TextField(default='')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('terminated_at', models.DateTimeField(null=True)),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='UserHostingKey',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('public_key', models.TextField()),
|
||||
('private_key', models.FileField(blank=True, upload_to='private_keys')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('name', models.CharField(max_length=100)),
|
||||
('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='UserCardDetail',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('last4', models.CharField(max_length=4)),
|
||||
('brand', models.CharField(max_length=128)),
|
||||
('card_id', models.CharField(blank=True, default='', max_length=100)),
|
||||
('fingerprint', models.CharField(max_length=100)),
|
||||
('exp_month', models.IntegerField()),
|
||||
('exp_year', models.IntegerField()),
|
||||
('preferred', models.BooleanField(default=False)),
|
||||
('stripe_customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='membership.stripecustomer')),
|
||||
],
|
||||
options={
|
||||
'permissions': (('pr_view_usercarddetail', 'View User Card'),),
|
||||
},
|
||||
bases=(utils.mixins.AssignPermissionsMixin, models.Model),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='OrderDetail',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('cores', models.IntegerField(default=0)),
|
||||
('memory', models.IntegerField(default=0)),
|
||||
('hdd_size', models.IntegerField(default=0)),
|
||||
('ssd_size', models.IntegerField(default=0)),
|
||||
('vm_template', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='datacenterlight.vmtemplate')),
|
||||
],
|
||||
bases=(utils.mixins.AssignPermissionsMixin, models.Model),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='MonthlyHostingBill',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created', models.DateTimeField(help_text='When the invoice was created')),
|
||||
('receipt_number', models.CharField(help_text='The receipt number that is generated on Stripe', max_length=100)),
|
||||
('invoice_number', models.CharField(help_text='The invoice number that is generated on Stripe', max_length=100)),
|
||||
('paid_at', models.DateTimeField(help_text='Date on which the bill was paid')),
|
||||
('period_start', models.DateTimeField()),
|
||||
('period_end', models.DateTimeField()),
|
||||
('billing_reason', models.CharField(max_length=25)),
|
||||
('discount', models.PositiveIntegerField()),
|
||||
('total', models.IntegerField()),
|
||||
('lines_data_count', models.IntegerField()),
|
||||
('invoice_id', models.CharField(max_length=100, unique=True)),
|
||||
('lines_meta_data_csv', models.TextField(default='')),
|
||||
('subscription_ids_csv', models.TextField(default='')),
|
||||
('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='membership.stripecustomer')),
|
||||
('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='hosting.hostingorder')),
|
||||
],
|
||||
options={
|
||||
'permissions': (('pr_view_monthlyhostingbill', 'View Monthly Hosting'),),
|
||||
},
|
||||
bases=(utils.mixins.AssignPermissionsMixin, models.Model),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='hostingorder',
|
||||
name='order_detail',
|
||||
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='hosting.orderdetail'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='hostingorder',
|
||||
name='vm_pricing',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='datacenterlight.vmpricing'),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='HostingBillLineItem',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('amount', models.IntegerField()),
|
||||
('description', models.CharField(max_length=255)),
|
||||
('discountable', models.BooleanField()),
|
||||
('metadata', models.CharField(max_length=128)),
|
||||
('period_start', models.DateTimeField()),
|
||||
('period_end', models.DateTimeField()),
|
||||
('proration', models.BooleanField()),
|
||||
('quantity', models.PositiveIntegerField()),
|
||||
('unit_amount', models.PositiveIntegerField()),
|
||||
('monthly_hosting_bill', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='hosting.monthlyhostingbill')),
|
||||
('stripe_plan', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='datacenterlight.stripeplan')),
|
||||
],
|
||||
options={
|
||||
'permissions': (('pr_view_hostingbilllineitem', 'View Monthly Hosting Bill Line Item'),),
|
||||
},
|
||||
bases=(utils.mixins.AssignPermissionsMixin, models.Model),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='HostingBill',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('total_price', models.FloatField(default=0.0)),
|
||||
('billing_address', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='utils.billingaddress')),
|
||||
('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='membership.stripecustomer')),
|
||||
],
|
||||
options={
|
||||
'permissions': (('pr_view_hostingbill', 'View Hosting Bill'),),
|
||||
},
|
||||
bases=(utils.mixins.AssignPermissionsMixin, models.Model),
|
||||
),
|
||||
]
|
193
hosting/mixins.py
Normal file → Executable file
193
hosting/mixins.py
Normal file → Executable file
|
@ -1,181 +1,36 @@
|
|||
from django.contrib.auth import authenticate, login
|
||||
from django.contrib.auth.forms import SetPasswordForm
|
||||
from django.contrib.auth.tokens import default_token_generator
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.shortcuts import render
|
||||
from django.utils.encoding import force_bytes
|
||||
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.urls import reverse_lazy
|
||||
from django.views.decorators.cache import cache_control
|
||||
from django.views.generic import FormView, CreateView
|
||||
from django.shortcuts import redirect
|
||||
from django.conf import settings
|
||||
from django.contrib import messages
|
||||
from guardian.shortcuts import assign_perm
|
||||
from django.urls import reverse
|
||||
from django.utils.decorators import method_decorator
|
||||
from django.views.decorators.cache import cache_control
|
||||
|
||||
from .mailer import BaseEmail
|
||||
from hosting.models import CustomUser
|
||||
from opennebula_api.serializers import VirtualMachineTemplateSerializer
|
||||
from opennebula_api.opennebula_manager import OpenNebulaManager
|
||||
|
||||
# Create your views here.
|
||||
from .models import HostingPlan
|
||||
|
||||
|
||||
class SignupViewMixin(CreateView):
|
||||
model = CustomUser
|
||||
success_url = None
|
||||
class ProcessVMSelectionMixin(object):
|
||||
|
||||
def get_success_url(self):
|
||||
next_url = self.request.POST.get('next') if self.request.POST.get(
|
||||
'next') \
|
||||
else self.success_url
|
||||
def post(self, request, *args, **kwargs):
|
||||
|
||||
return next_url
|
||||
template_id = int(request.POST.get('vm_template_id'))
|
||||
configuration_id = int(request.POST.get('configuration'))
|
||||
template = OpenNebulaManager().get_template(template_id)
|
||||
data = VirtualMachineTemplateSerializer(template).data
|
||||
configuration = HostingPlan.objects.get(id=configuration_id)
|
||||
|
||||
def form_valid(self, form):
|
||||
name = form.cleaned_data.get('name')
|
||||
email = form.cleaned_data.get('email')
|
||||
password = form.cleaned_data.get('password')
|
||||
request.session['template'] = data
|
||||
request.session['specs'] = configuration.serialize()
|
||||
|
||||
CustomUser.register(name, password, email)
|
||||
auth_user = authenticate(email=email, password=password)
|
||||
login(self.request, auth_user)
|
||||
|
||||
return HttpResponseRedirect(self.get_success_url())
|
||||
if not request.user.is_authenticated():
|
||||
request.session['next'] = reverse('hosting:payment')
|
||||
return redirect(reverse('hosting:login'))
|
||||
return redirect(reverse('hosting:payment'))
|
||||
|
||||
|
||||
class LoginViewMixin(FormView):
|
||||
success_url = None
|
||||
|
||||
def get_success_url(self):
|
||||
next_url = self.request.POST.get('next', self.success_url)
|
||||
if not next_url:
|
||||
return self.success_url
|
||||
return next_url
|
||||
|
||||
def form_valid(self, form):
|
||||
email = form.cleaned_data.get('email')
|
||||
password = form.cleaned_data.get('password')
|
||||
auth_user = authenticate(email=email, password=password)
|
||||
|
||||
if auth_user:
|
||||
login(self.request, auth_user)
|
||||
return HttpResponseRedirect(self.get_success_url())
|
||||
|
||||
return HttpResponseRedirect(self.get_success_url())
|
||||
|
||||
# @cache_control(no_cache=True, must_revalidate=True, no_store=True)
|
||||
def get(self, request, *args, **kwargs):
|
||||
if self.request.user.is_authenticated:
|
||||
return HttpResponseRedirect(self.get_success_url())
|
||||
|
||||
return super(LoginViewMixin, self).get(request, *args, **kwargs)
|
||||
|
||||
|
||||
class ResendActivationLinkViewMixin(FormView):
|
||||
success_message = _(
|
||||
"An email with the activation link has been sent to you")
|
||||
|
||||
def generate_email_context(self, user):
|
||||
context = {
|
||||
'base_url': "{0}://{1}".format(self.request.scheme,
|
||||
self.request.get_host()),
|
||||
'activation_link': reverse_lazy(
|
||||
'hosting:validate',
|
||||
kwargs={'validate_slug': user.validation_slug}
|
||||
),
|
||||
'dcl_text': settings.DCL_TEXT,
|
||||
}
|
||||
class HostingContextMixin(object):
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
#context['MULTISITE_CMS_FALLBACK'] = settings.MULTISITE_CMS_FALLBACK
|
||||
return context
|
||||
|
||||
def form_valid(self, form):
|
||||
email = form.cleaned_data.get('email')
|
||||
user = CustomUser.objects.get(email=email)
|
||||
messages.add_message(self.request, messages.SUCCESS,
|
||||
self.success_message)
|
||||
context = self.generate_email_context(user)
|
||||
email_data = {
|
||||
'subject': '{dcl_text} {account_activation}'.format(
|
||||
dcl_text=settings.DCL_TEXT,
|
||||
account_activation=_('Account Activation')
|
||||
),
|
||||
'to': email,
|
||||
'context': context,
|
||||
'template_name': self.email_template_name,
|
||||
'template_path': self.email_template_path,
|
||||
'from_address': settings.DCL_SUPPORT_FROM_ADDRESS
|
||||
}
|
||||
email = BaseEmail(**email_data)
|
||||
email.send()
|
||||
return HttpResponseRedirect(self.get_success_url())
|
||||
|
||||
|
||||
class PasswordResetViewMixin(FormView):
|
||||
success_message = _(
|
||||
"The link to reset your password has been sent to your email")
|
||||
site = ''
|
||||
|
||||
def test_generate_email_context(self, user):
|
||||
context = {
|
||||
'user': user,
|
||||
'token': default_token_generator.make_token(user),
|
||||
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
|
||||
'site_name': 'ungleich' if self.site != 'dcl' else settings.DCL_TEXT,
|
||||
'base_url': "{0}://{1}".format(self.request.scheme,
|
||||
self.request.get_host())
|
||||
}
|
||||
return context
|
||||
|
||||
def form_valid(self, form):
|
||||
email = form.cleaned_data.get('email')
|
||||
user = CustomUser.objects.get(email=email)
|
||||
messages.add_message(self.request, messages.SUCCESS,
|
||||
self.success_message)
|
||||
context = self.test_generate_email_context(user)
|
||||
email_data = {
|
||||
'subject': _('Password Reset'),
|
||||
'to': email,
|
||||
'context': context,
|
||||
'template_name': 'password_reset_email',
|
||||
'template_path': self.template_email_path
|
||||
}
|
||||
if self.site == 'dcl':
|
||||
email_data['from_address'] = settings.DCL_SUPPORT_FROM_ADDRESS
|
||||
email = BaseEmail(**email_data)
|
||||
email.send()
|
||||
|
||||
return HttpResponseRedirect(self.get_success_url())
|
||||
|
||||
|
||||
class PasswordResetConfirmViewMixin(FormView):
|
||||
form_class = SetPasswordForm
|
||||
|
||||
def post(self, request, uidb64=None, token=None, *arg, **kwargs):
|
||||
try:
|
||||
uid = urlsafe_base64_decode(uidb64)
|
||||
user = CustomUser.objects.get(pk=uid)
|
||||
except (TypeError, ValueError, OverflowError, CustomUser.DoesNotExist):
|
||||
user = None
|
||||
|
||||
form = self.form_class(request.POST)
|
||||
|
||||
if user is not None and default_token_generator.check_token(user,
|
||||
token):
|
||||
if form.is_valid():
|
||||
new_password = form.cleaned_data['new_password2']
|
||||
user.set_password(new_password)
|
||||
user.save()
|
||||
messages.success(request, _('Password has been reset.'))
|
||||
return self.form_valid(form)
|
||||
else:
|
||||
messages.error(request,
|
||||
_('Password reset has not been successful.'))
|
||||
form.add_error(None,
|
||||
_('Password reset has not been successful.'))
|
||||
return self.form_invalid(form)
|
||||
|
||||
else:
|
||||
messages.error(request,
|
||||
_('The reset password link is no longer valid.'))
|
||||
form.add_error(None,
|
||||
_('The reset password link is no longer valid.'))
|
||||
return self.form_invalid(form)
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,14 +0,0 @@
|
|||
asgiref==3.7.2
|
||||
certifi==2023.11.17
|
||||
charset-normalizer==3.3.2
|
||||
Django==4.2.7
|
||||
idna==3.4
|
||||
ldap3==2.9.1
|
||||
pyasn1==0.5.1
|
||||
pycryptodome==3.19.0
|
||||
python-dotenv==1.0.0
|
||||
requests==2.31.0
|
||||
sqlparse==0.4.4
|
||||
stripe==7.5.0
|
||||
typing_extensions==4.8.0
|
||||
urllib3==2.1.0
|
Binary file not shown.
Before Width: | Height: | Size: 1.1 KiB |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load diff
Before Width: | Height: | Size: 434 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,16 +0,0 @@
|
|||
// Bordered & Pulled
|
||||
// -------------------------
|
||||
|
||||
.@{fa-css-prefix}-border {
|
||||
padding: .2em .25em .15em;
|
||||
border: solid .08em @fa-border-color;
|
||||
border-radius: .1em;
|
||||
}
|
||||
|
||||
.pull-right { float: right; }
|
||||
.pull-left { float: left; }
|
||||
|
||||
.@{fa-css-prefix} {
|
||||
&.pull-left { margin-right: .3em; }
|
||||
&.pull-right { margin-left: .3em; }
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
// Base Class Definition
|
||||
// -------------------------
|
||||
|
||||
.@{fa-css-prefix} {
|
||||
display: inline-block;
|
||||
font: normal normal normal 14px/1 FontAwesome; // shortening font declaration
|
||||
font-size: inherit; // can't have font-size inherit on line above, so need to override
|
||||
text-rendering: auto; // optimizelegibility throws things off #1094
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
// Fixed Width Icons
|
||||
// -------------------------
|
||||
.@{fa-css-prefix}-fw {
|
||||
width: (18em / 14);
|
||||
text-align: center;
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
/*!
|
||||
* Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
|
||||
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
|
||||
*/
|
||||
|
||||
@import "variables.less";
|
||||
@import "mixins.less";
|
||||
@import "path.less";
|
||||
@import "core.less";
|
||||
@import "larger.less";
|
||||
@import "fixed-width.less";
|
||||
@import "list.less";
|
||||
@import "bordered-pulled.less";
|
||||
@import "spinning.less";
|
||||
@import "rotated-flipped.less";
|
||||
@import "stacked.less";
|
||||
@import "icons.less";
|
552
hosting/static/hosting/font-awesome/less/icons.less
vendored
552
hosting/static/hosting/font-awesome/less/icons.less
vendored
|
@ -1,552 +0,0 @@
|
|||
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
|
||||
readers do not read off random characters that represent icons */
|
||||
|
||||
.@{fa-css-prefix}-glass:before { content: @fa-var-glass; }
|
||||
.@{fa-css-prefix}-music:before { content: @fa-var-music; }
|
||||
.@{fa-css-prefix}-search:before { content: @fa-var-search; }
|
||||
.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; }
|
||||
.@{fa-css-prefix}-heart:before { content: @fa-var-heart; }
|
||||
.@{fa-css-prefix}-star:before { content: @fa-var-star; }
|
||||
.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; }
|
||||
.@{fa-css-prefix}-user:before { content: @fa-var-user; }
|
||||
.@{fa-css-prefix}-film:before { content: @fa-var-film; }
|
||||
.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }
|
||||
.@{fa-css-prefix}-th:before { content: @fa-var-th; }
|
||||
.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }
|
||||
.@{fa-css-prefix}-check:before { content: @fa-var-check; }
|
||||
.@{fa-css-prefix}-remove:before,
|
||||
.@{fa-css-prefix}-close:before,
|
||||
.@{fa-css-prefix}-times:before { content: @fa-var-times; }
|
||||
.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }
|
||||
.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }
|
||||
.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }
|
||||
.@{fa-css-prefix}-signal:before { content: @fa-var-signal; }
|
||||
.@{fa-css-prefix}-gear:before,
|
||||
.@{fa-css-prefix}-cog:before { content: @fa-var-cog; }
|
||||
.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; }
|
||||
.@{fa-css-prefix}-home:before { content: @fa-var-home; }
|
||||
.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; }
|
||||
.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; }
|
||||
.@{fa-css-prefix}-road:before { content: @fa-var-road; }
|
||||
.@{fa-css-prefix}-download:before { content: @fa-var-download; }
|
||||
.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; }
|
||||
.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; }
|
||||
.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }
|
||||
.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; }
|
||||
.@{fa-css-prefix}-rotate-right:before,
|
||||
.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; }
|
||||
.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; }
|
||||
.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }
|
||||
.@{fa-css-prefix}-lock:before { content: @fa-var-lock; }
|
||||
.@{fa-css-prefix}-flag:before { content: @fa-var-flag; }
|
||||
.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }
|
||||
.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }
|
||||
.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }
|
||||
.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }
|
||||
.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }
|
||||
.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }
|
||||
.@{fa-css-prefix}-tag:before { content: @fa-var-tag; }
|
||||
.@{fa-css-prefix}-tags:before { content: @fa-var-tags; }
|
||||
.@{fa-css-prefix}-book:before { content: @fa-var-book; }
|
||||
.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }
|
||||
.@{fa-css-prefix}-print:before { content: @fa-var-print; }
|
||||
.@{fa-css-prefix}-camera:before { content: @fa-var-camera; }
|
||||
.@{fa-css-prefix}-font:before { content: @fa-var-font; }
|
||||
.@{fa-css-prefix}-bold:before { content: @fa-var-bold; }
|
||||
.@{fa-css-prefix}-italic:before { content: @fa-var-italic; }
|
||||
.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }
|
||||
.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }
|
||||
.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }
|
||||
.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }
|
||||
.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }
|
||||
.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }
|
||||
.@{fa-css-prefix}-list:before { content: @fa-var-list; }
|
||||
.@{fa-css-prefix}-dedent:before,
|
||||
.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; }
|
||||
.@{fa-css-prefix}-indent:before { content: @fa-var-indent; }
|
||||
.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; }
|
||||
.@{fa-css-prefix}-photo:before,
|
||||
.@{fa-css-prefix}-image:before,
|
||||
.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; }
|
||||
.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; }
|
||||
.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; }
|
||||
.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; }
|
||||
.@{fa-css-prefix}-tint:before { content: @fa-var-tint; }
|
||||
.@{fa-css-prefix}-edit:before,
|
||||
.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; }
|
||||
.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; }
|
||||
.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; }
|
||||
.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; }
|
||||
.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; }
|
||||
.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; }
|
||||
.@{fa-css-prefix}-backward:before { content: @fa-var-backward; }
|
||||
.@{fa-css-prefix}-play:before { content: @fa-var-play; }
|
||||
.@{fa-css-prefix}-pause:before { content: @fa-var-pause; }
|
||||
.@{fa-css-prefix}-stop:before { content: @fa-var-stop; }
|
||||
.@{fa-css-prefix}-forward:before { content: @fa-var-forward; }
|
||||
.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; }
|
||||
.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; }
|
||||
.@{fa-css-prefix}-eject:before { content: @fa-var-eject; }
|
||||
.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; }
|
||||
.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; }
|
||||
.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; }
|
||||
.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; }
|
||||
.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; }
|
||||
.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; }
|
||||
.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; }
|
||||
.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; }
|
||||
.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; }
|
||||
.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; }
|
||||
.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; }
|
||||
.@{fa-css-prefix}-ban:before { content: @fa-var-ban; }
|
||||
.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; }
|
||||
.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; }
|
||||
.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; }
|
||||
.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; }
|
||||
.@{fa-css-prefix}-mail-forward:before,
|
||||
.@{fa-css-prefix}-share:before { content: @fa-var-share; }
|
||||
.@{fa-css-prefix}-expand:before { content: @fa-var-expand; }
|
||||
.@{fa-css-prefix}-compress:before { content: @fa-var-compress; }
|
||||
.@{fa-css-prefix}-plus:before { content: @fa-var-plus; }
|
||||
.@{fa-css-prefix}-minus:before { content: @fa-var-minus; }
|
||||
.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; }
|
||||
.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; }
|
||||
.@{fa-css-prefix}-gift:before { content: @fa-var-gift; }
|
||||
.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; }
|
||||
.@{fa-css-prefix}-fire:before { content: @fa-var-fire; }
|
||||
.@{fa-css-prefix}-eye:before { content: @fa-var-eye; }
|
||||
.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; }
|
||||
.@{fa-css-prefix}-warning:before,
|
||||
.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; }
|
||||
.@{fa-css-prefix}-plane:before { content: @fa-var-plane; }
|
||||
.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; }
|
||||
.@{fa-css-prefix}-random:before { content: @fa-var-random; }
|
||||
.@{fa-css-prefix}-comment:before { content: @fa-var-comment; }
|
||||
.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; }
|
||||
.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; }
|
||||
.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; }
|
||||
.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; }
|
||||
.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; }
|
||||
.@{fa-css-prefix}-folder:before { content: @fa-var-folder; }
|
||||
.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }
|
||||
.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; }
|
||||
.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; }
|
||||
.@{fa-css-prefix}-bar-chart-o:before,
|
||||
.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; }
|
||||
.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }
|
||||
.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }
|
||||
.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }
|
||||
.@{fa-css-prefix}-key:before { content: @fa-var-key; }
|
||||
.@{fa-css-prefix}-gears:before,
|
||||
.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; }
|
||||
.@{fa-css-prefix}-comments:before { content: @fa-var-comments; }
|
||||
.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; }
|
||||
.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; }
|
||||
.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; }
|
||||
.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; }
|
||||
.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; }
|
||||
.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; }
|
||||
.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; }
|
||||
.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; }
|
||||
.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; }
|
||||
.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; }
|
||||
.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; }
|
||||
.@{fa-css-prefix}-upload:before { content: @fa-var-upload; }
|
||||
.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; }
|
||||
.@{fa-css-prefix}-phone:before { content: @fa-var-phone; }
|
||||
.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; }
|
||||
.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; }
|
||||
.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; }
|
||||
.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; }
|
||||
.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; }
|
||||
.@{fa-css-prefix}-github:before { content: @fa-var-github; }
|
||||
.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; }
|
||||
.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; }
|
||||
.@{fa-css-prefix}-rss:before { content: @fa-var-rss; }
|
||||
.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; }
|
||||
.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; }
|
||||
.@{fa-css-prefix}-bell:before { content: @fa-var-bell; }
|
||||
.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; }
|
||||
.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; }
|
||||
.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; }
|
||||
.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; }
|
||||
.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; }
|
||||
.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; }
|
||||
.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; }
|
||||
.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; }
|
||||
.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; }
|
||||
.@{fa-css-prefix}-globe:before { content: @fa-var-globe; }
|
||||
.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; }
|
||||
.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; }
|
||||
.@{fa-css-prefix}-filter:before { content: @fa-var-filter; }
|
||||
.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; }
|
||||
.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; }
|
||||
.@{fa-css-prefix}-group:before,
|
||||
.@{fa-css-prefix}-users:before { content: @fa-var-users; }
|
||||
.@{fa-css-prefix}-chain:before,
|
||||
.@{fa-css-prefix}-link:before { content: @fa-var-link; }
|
||||
.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; }
|
||||
.@{fa-css-prefix}-flask:before { content: @fa-var-flask; }
|
||||
.@{fa-css-prefix}-cut:before,
|
||||
.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; }
|
||||
.@{fa-css-prefix}-copy:before,
|
||||
.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; }
|
||||
.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; }
|
||||
.@{fa-css-prefix}-save:before,
|
||||
.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; }
|
||||
.@{fa-css-prefix}-square:before { content: @fa-var-square; }
|
||||
.@{fa-css-prefix}-navicon:before,
|
||||
.@{fa-css-prefix}-reorder:before,
|
||||
.@{fa-css-prefix}-bars:before { content: @fa-var-bars; }
|
||||
.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; }
|
||||
.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; }
|
||||
.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; }
|
||||
.@{fa-css-prefix}-underline:before { content: @fa-var-underline; }
|
||||
.@{fa-css-prefix}-table:before { content: @fa-var-table; }
|
||||
.@{fa-css-prefix}-magic:before { content: @fa-var-magic; }
|
||||
.@{fa-css-prefix}-truck:before { content: @fa-var-truck; }
|
||||
.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; }
|
||||
.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; }
|
||||
.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; }
|
||||
.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; }
|
||||
.@{fa-css-prefix}-money:before { content: @fa-var-money; }
|
||||
.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; }
|
||||
.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; }
|
||||
.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; }
|
||||
.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; }
|
||||
.@{fa-css-prefix}-columns:before { content: @fa-var-columns; }
|
||||
.@{fa-css-prefix}-unsorted:before,
|
||||
.@{fa-css-prefix}-sort:before { content: @fa-var-sort; }
|
||||
.@{fa-css-prefix}-sort-down:before,
|
||||
.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; }
|
||||
.@{fa-css-prefix}-sort-up:before,
|
||||
.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; }
|
||||
.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; }
|
||||
.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; }
|
||||
.@{fa-css-prefix}-rotate-left:before,
|
||||
.@{fa-css-prefix}-undo:before { content: @fa-var-undo; }
|
||||
.@{fa-css-prefix}-legal:before,
|
||||
.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; }
|
||||
.@{fa-css-prefix}-dashboard:before,
|
||||
.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; }
|
||||
.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; }
|
||||
.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; }
|
||||
.@{fa-css-prefix}-flash:before,
|
||||
.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; }
|
||||
.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; }
|
||||
.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; }
|
||||
.@{fa-css-prefix}-paste:before,
|
||||
.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; }
|
||||
.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; }
|
||||
.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; }
|
||||
.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; }
|
||||
.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; }
|
||||
.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; }
|
||||
.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; }
|
||||
.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; }
|
||||
.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; }
|
||||
.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; }
|
||||
.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; }
|
||||
.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; }
|
||||
.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; }
|
||||
.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; }
|
||||
.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; }
|
||||
.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; }
|
||||
.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; }
|
||||
.@{fa-css-prefix}-beer:before { content: @fa-var-beer; }
|
||||
.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; }
|
||||
.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; }
|
||||
.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; }
|
||||
.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; }
|
||||
.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; }
|
||||
.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; }
|
||||
.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; }
|
||||
.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; }
|
||||
.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; }
|
||||
.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; }
|
||||
.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; }
|
||||
.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; }
|
||||
.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; }
|
||||
.@{fa-css-prefix}-mobile-phone:before,
|
||||
.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; }
|
||||
.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; }
|
||||
.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; }
|
||||
.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; }
|
||||
.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; }
|
||||
.@{fa-css-prefix}-circle:before { content: @fa-var-circle; }
|
||||
.@{fa-css-prefix}-mail-reply:before,
|
||||
.@{fa-css-prefix}-reply:before { content: @fa-var-reply; }
|
||||
.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; }
|
||||
.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; }
|
||||
.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; }
|
||||
.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; }
|
||||
.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; }
|
||||
.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; }
|
||||
.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; }
|
||||
.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; }
|
||||
.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; }
|
||||
.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; }
|
||||
.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; }
|
||||
.@{fa-css-prefix}-code:before { content: @fa-var-code; }
|
||||
.@{fa-css-prefix}-mail-reply-all:before,
|
||||
.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; }
|
||||
.@{fa-css-prefix}-star-half-empty:before,
|
||||
.@{fa-css-prefix}-star-half-full:before,
|
||||
.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; }
|
||||
.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; }
|
||||
.@{fa-css-prefix}-crop:before { content: @fa-var-crop; }
|
||||
.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; }
|
||||
.@{fa-css-prefix}-unlink:before,
|
||||
.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; }
|
||||
.@{fa-css-prefix}-question:before { content: @fa-var-question; }
|
||||
.@{fa-css-prefix}-info:before { content: @fa-var-info; }
|
||||
.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; }
|
||||
.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; }
|
||||
.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; }
|
||||
.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; }
|
||||
.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; }
|
||||
.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; }
|
||||
.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; }
|
||||
.@{fa-css-prefix}-shield:before { content: @fa-var-shield; }
|
||||
.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; }
|
||||
.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; }
|
||||
.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; }
|
||||
.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; }
|
||||
.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; }
|
||||
.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; }
|
||||
.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; }
|
||||
.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; }
|
||||
.@{fa-css-prefix}-html5:before { content: @fa-var-html5; }
|
||||
.@{fa-css-prefix}-css3:before { content: @fa-var-css3; }
|
||||
.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; }
|
||||
.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; }
|
||||
.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; }
|
||||
.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; }
|
||||
.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; }
|
||||
.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; }
|
||||
.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; }
|
||||
.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; }
|
||||
.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; }
|
||||
.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; }
|
||||
.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; }
|
||||
.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; }
|
||||
.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; }
|
||||
.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; }
|
||||
.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; }
|
||||
.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; }
|
||||
.@{fa-css-prefix}-compass:before { content: @fa-var-compass; }
|
||||
.@{fa-css-prefix}-toggle-down:before,
|
||||
.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; }
|
||||
.@{fa-css-prefix}-toggle-up:before,
|
||||
.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; }
|
||||
.@{fa-css-prefix}-toggle-right:before,
|
||||
.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; }
|
||||
.@{fa-css-prefix}-euro:before,
|
||||
.@{fa-css-prefix}-eur:before { content: @fa-var-eur; }
|
||||
.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; }
|
||||
.@{fa-css-prefix}-dollar:before,
|
||||
.@{fa-css-prefix}-usd:before { content: @fa-var-usd; }
|
||||
.@{fa-css-prefix}-rupee:before,
|
||||
.@{fa-css-prefix}-inr:before { content: @fa-var-inr; }
|
||||
.@{fa-css-prefix}-cny:before,
|
||||
.@{fa-css-prefix}-rmb:before,
|
||||
.@{fa-css-prefix}-yen:before,
|
||||
.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; }
|
||||
.@{fa-css-prefix}-ruble:before,
|
||||
.@{fa-css-prefix}-rouble:before,
|
||||
.@{fa-css-prefix}-rub:before { content: @fa-var-rub; }
|
||||
.@{fa-css-prefix}-won:before,
|
||||
.@{fa-css-prefix}-krw:before { content: @fa-var-krw; }
|
||||
.@{fa-css-prefix}-bitcoin:before,
|
||||
.@{fa-css-prefix}-btc:before { content: @fa-var-btc; }
|
||||
.@{fa-css-prefix}-file:before { content: @fa-var-file; }
|
||||
.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; }
|
||||
.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; }
|
||||
.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; }
|
||||
.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; }
|
||||
.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; }
|
||||
.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; }
|
||||
.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; }
|
||||
.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; }
|
||||
.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; }
|
||||
.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; }
|
||||
.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; }
|
||||
.@{fa-css-prefix}-xing:before { content: @fa-var-xing; }
|
||||
.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; }
|
||||
.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; }
|
||||
.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; }
|
||||
.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; }
|
||||
.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; }
|
||||
.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; }
|
||||
.@{fa-css-prefix}-adn:before { content: @fa-var-adn; }
|
||||
.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; }
|
||||
.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; }
|
||||
.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; }
|
||||
.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; }
|
||||
.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; }
|
||||
.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; }
|
||||
.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; }
|
||||
.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; }
|
||||
.@{fa-css-prefix}-apple:before { content: @fa-var-apple; }
|
||||
.@{fa-css-prefix}-windows:before { content: @fa-var-windows; }
|
||||
.@{fa-css-prefix}-android:before { content: @fa-var-android; }
|
||||
.@{fa-css-prefix}-linux:before { content: @fa-var-linux; }
|
||||
.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; }
|
||||
.@{fa-css-prefix}-skype:before { content: @fa-var-skype; }
|
||||
.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; }
|
||||
.@{fa-css-prefix}-trello:before { content: @fa-var-trello; }
|
||||
.@{fa-css-prefix}-female:before { content: @fa-var-female; }
|
||||
.@{fa-css-prefix}-male:before { content: @fa-var-male; }
|
||||
.@{fa-css-prefix}-gittip:before { content: @fa-var-gittip; }
|
||||
.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; }
|
||||
.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; }
|
||||
.@{fa-css-prefix}-archive:before { content: @fa-var-archive; }
|
||||
.@{fa-css-prefix}-bug:before { content: @fa-var-bug; }
|
||||
.@{fa-css-prefix}-vk:before { content: @fa-var-vk; }
|
||||
.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; }
|
||||
.@{fa-css-prefix}-renren:before { content: @fa-var-renren; }
|
||||
.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; }
|
||||
.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; }
|
||||
.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; }
|
||||
.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; }
|
||||
.@{fa-css-prefix}-toggle-left:before,
|
||||
.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; }
|
||||
.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; }
|
||||
.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; }
|
||||
.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; }
|
||||
.@{fa-css-prefix}-turkish-lira:before,
|
||||
.@{fa-css-prefix}-try:before { content: @fa-var-try; }
|
||||
.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; }
|
||||
.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; }
|
||||
.@{fa-css-prefix}-slack:before { content: @fa-var-slack; }
|
||||
.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; }
|
||||
.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; }
|
||||
.@{fa-css-prefix}-openid:before { content: @fa-var-openid; }
|
||||
.@{fa-css-prefix}-institution:before,
|
||||
.@{fa-css-prefix}-bank:before,
|
||||
.@{fa-css-prefix}-university:before { content: @fa-var-university; }
|
||||
.@{fa-css-prefix}-mortar-board:before,
|
||||
.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; }
|
||||
.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; }
|
||||
.@{fa-css-prefix}-google:before { content: @fa-var-google; }
|
||||
.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; }
|
||||
.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; }
|
||||
.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; }
|
||||
.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }
|
||||
.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }
|
||||
.@{fa-css-prefix}-digg:before { content: @fa-var-digg; }
|
||||
.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }
|
||||
.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }
|
||||
.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }
|
||||
.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; }
|
||||
.@{fa-css-prefix}-language:before { content: @fa-var-language; }
|
||||
.@{fa-css-prefix}-fax:before { content: @fa-var-fax; }
|
||||
.@{fa-css-prefix}-building:before { content: @fa-var-building; }
|
||||
.@{fa-css-prefix}-child:before { content: @fa-var-child; }
|
||||
.@{fa-css-prefix}-paw:before { content: @fa-var-paw; }
|
||||
.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; }
|
||||
.@{fa-css-prefix}-cube:before { content: @fa-var-cube; }
|
||||
.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; }
|
||||
.@{fa-css-prefix}-behance:before { content: @fa-var-behance; }
|
||||
.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; }
|
||||
.@{fa-css-prefix}-steam:before { content: @fa-var-steam; }
|
||||
.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; }
|
||||
.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; }
|
||||
.@{fa-css-prefix}-automobile:before,
|
||||
.@{fa-css-prefix}-car:before { content: @fa-var-car; }
|
||||
.@{fa-css-prefix}-cab:before,
|
||||
.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; }
|
||||
.@{fa-css-prefix}-tree:before { content: @fa-var-tree; }
|
||||
.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; }
|
||||
.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; }
|
||||
.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; }
|
||||
.@{fa-css-prefix}-database:before { content: @fa-var-database; }
|
||||
.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; }
|
||||
.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; }
|
||||
.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; }
|
||||
.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; }
|
||||
.@{fa-css-prefix}-file-photo-o:before,
|
||||
.@{fa-css-prefix}-file-picture-o:before,
|
||||
.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; }
|
||||
.@{fa-css-prefix}-file-zip-o:before,
|
||||
.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; }
|
||||
.@{fa-css-prefix}-file-sound-o:before,
|
||||
.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; }
|
||||
.@{fa-css-prefix}-file-movie-o:before,
|
||||
.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; }
|
||||
.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; }
|
||||
.@{fa-css-prefix}-vine:before { content: @fa-var-vine; }
|
||||
.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }
|
||||
.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }
|
||||
.@{fa-css-prefix}-life-bouy:before,
|
||||
.@{fa-css-prefix}-life-buoy:before,
|
||||
.@{fa-css-prefix}-life-saver:before,
|
||||
.@{fa-css-prefix}-support:before,
|
||||
.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }
|
||||
.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; }
|
||||
.@{fa-css-prefix}-ra:before,
|
||||
.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; }
|
||||
.@{fa-css-prefix}-ge:before,
|
||||
.@{fa-css-prefix}-empire:before { content: @fa-var-empire; }
|
||||
.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; }
|
||||
.@{fa-css-prefix}-git:before { content: @fa-var-git; }
|
||||
.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; }
|
||||
.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; }
|
||||
.@{fa-css-prefix}-qq:before { content: @fa-var-qq; }
|
||||
.@{fa-css-prefix}-wechat:before,
|
||||
.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; }
|
||||
.@{fa-css-prefix}-send:before,
|
||||
.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; }
|
||||
.@{fa-css-prefix}-send-o:before,
|
||||
.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; }
|
||||
.@{fa-css-prefix}-history:before { content: @fa-var-history; }
|
||||
.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; }
|
||||
.@{fa-css-prefix}-header:before { content: @fa-var-header; }
|
||||
.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; }
|
||||
.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; }
|
||||
.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }
|
||||
.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }
|
||||
.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }
|
||||
.@{fa-css-prefix}-soccer-ball-o:before,
|
||||
.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; }
|
||||
.@{fa-css-prefix}-tty:before { content: @fa-var-tty; }
|
||||
.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; }
|
||||
.@{fa-css-prefix}-plug:before { content: @fa-var-plug; }
|
||||
.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; }
|
||||
.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; }
|
||||
.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; }
|
||||
.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; }
|
||||
.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; }
|
||||
.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; }
|
||||
.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; }
|
||||
.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; }
|
||||
.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; }
|
||||
.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; }
|
||||
.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; }
|
||||
.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; }
|
||||
.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; }
|
||||
.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; }
|
||||
.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; }
|
||||
.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; }
|
||||
.@{fa-css-prefix}-trash:before { content: @fa-var-trash; }
|
||||
.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; }
|
||||
.@{fa-css-prefix}-at:before { content: @fa-var-at; }
|
||||
.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; }
|
||||
.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; }
|
||||
.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; }
|
||||
.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; }
|
||||
.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; }
|
||||
.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; }
|
||||
.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; }
|
||||
.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; }
|
||||
.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; }
|
||||
.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; }
|
||||
.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; }
|
||||
.@{fa-css-prefix}-bus:before { content: @fa-var-bus; }
|
||||
.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; }
|
||||
.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; }
|
||||
.@{fa-css-prefix}-cc:before { content: @fa-var-cc; }
|
||||
.@{fa-css-prefix}-shekel:before,
|
||||
.@{fa-css-prefix}-sheqel:before,
|
||||
.@{fa-css-prefix}-ils:before { content: @fa-var-ils; }
|
||||
.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; }
|
|
@ -1,13 +0,0 @@
|
|||
// Icon Sizes
|
||||
// -------------------------
|
||||
|
||||
/* makes the font 33% larger relative to the icon container */
|
||||
.@{fa-css-prefix}-lg {
|
||||
font-size: (4em / 3);
|
||||
line-height: (3em / 4);
|
||||
vertical-align: -15%;
|
||||
}
|
||||
.@{fa-css-prefix}-2x { font-size: 2em; }
|
||||
.@{fa-css-prefix}-3x { font-size: 3em; }
|
||||
.@{fa-css-prefix}-4x { font-size: 4em; }
|
||||
.@{fa-css-prefix}-5x { font-size: 5em; }
|
|
@ -1,19 +0,0 @@
|
|||
// List Icons
|
||||
// -------------------------
|
||||
|
||||
.@{fa-css-prefix}-ul {
|
||||
padding-left: 0;
|
||||
margin-left: @fa-li-width;
|
||||
list-style-type: none;
|
||||
> li { position: relative; }
|
||||
}
|
||||
.@{fa-css-prefix}-li {
|
||||
position: absolute;
|
||||
left: -@fa-li-width;
|
||||
width: @fa-li-width;
|
||||
top: (2em / 14);
|
||||
text-align: center;
|
||||
&.@{fa-css-prefix}-lg {
|
||||
left: (-@fa-li-width + (4em / 14));
|
||||
}
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
// Mixins
|
||||
// --------------------------
|
||||
|
||||
.fa-icon() {
|
||||
display: inline-block;
|
||||
font: normal normal normal 14px/1 FontAwesome; // shortening font declaration
|
||||
font-size: inherit; // can't have font-size inherit on line above, so need to override
|
||||
text-rendering: auto; // optimizelegibility throws things off #1094
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.fa-icon-rotate(@degrees, @rotation) {
|
||||
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation);
|
||||
-webkit-transform: rotate(@degrees);
|
||||
-ms-transform: rotate(@degrees);
|
||||
transform: rotate(@degrees);
|
||||
}
|
||||
|
||||
.fa-icon-flip(@horiz, @vert, @rotation) {
|
||||
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1);
|
||||
-webkit-transform: scale(@horiz, @vert);
|
||||
-ms-transform: scale(@horiz, @vert);
|
||||
transform: scale(@horiz, @vert);
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
/* FONT PATH
|
||||
* -------------------------- */
|
||||
|
||||
@font-face {
|
||||
font-family: 'FontAwesome';
|
||||
src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
|
||||
src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
|
||||
url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
|
||||
url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
|
||||
url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
|
||||
// src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
// Rotated & Flipped Icons
|
||||
// -------------------------
|
||||
|
||||
.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }
|
||||
.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
|
||||
.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
|
||||
|
||||
.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
|
||||
.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
|
||||
|
||||
// Hook for IE8-9
|
||||
// -------------------------
|
||||
|
||||
:root .@{fa-css-prefix}-rotate-90,
|
||||
:root .@{fa-css-prefix}-rotate-180,
|
||||
:root .@{fa-css-prefix}-rotate-270,
|
||||
:root .@{fa-css-prefix}-flip-horizontal,
|
||||
:root .@{fa-css-prefix}-flip-vertical {
|
||||
filter: none;
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
// Spinning Icons
|
||||
// --------------------------
|
||||
|
||||
.@{fa-css-prefix}-spin {
|
||||
-webkit-animation: fa-spin 2s infinite linear;
|
||||
animation: fa-spin 2s infinite linear;
|
||||
}
|
||||
|
||||
@-webkit-keyframes fa-spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
-webkit-transform: rotate(359deg);
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fa-spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
-webkit-transform: rotate(359deg);
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
// Stacked Icons
|
||||
// -------------------------
|
||||
|
||||
.@{fa-css-prefix}-stack {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 2em;
|
||||
height: 2em;
|
||||
line-height: 2em;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
.@{fa-css-prefix}-stack-1x { line-height: inherit; }
|
||||
.@{fa-css-prefix}-stack-2x { font-size: 2em; }
|
||||
.@{fa-css-prefix}-inverse { color: @fa-inverse; }
|
|
@ -1,561 +0,0 @@
|
|||
// Variables
|
||||
// --------------------------
|
||||
|
||||
@fa-font-path: "../fonts";
|
||||
//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts"; // for referencing Bootstrap CDN font files directly
|
||||
@fa-css-prefix: fa;
|
||||
@fa-version: "4.2.0";
|
||||
@fa-border-color: #eee;
|
||||
@fa-inverse: #fff;
|
||||
@fa-li-width: (30em / 14);
|
||||
|
||||
@fa-var-adjust: "\f042";
|
||||
@fa-var-adn: "\f170";
|
||||
@fa-var-align-center: "\f037";
|
||||
@fa-var-align-justify: "\f039";
|
||||
@fa-var-align-left: "\f036";
|
||||
@fa-var-align-right: "\f038";
|
||||
@fa-var-ambulance: "\f0f9";
|
||||
@fa-var-anchor: "\f13d";
|
||||
@fa-var-android: "\f17b";
|
||||
@fa-var-angellist: "\f209";
|
||||
@fa-var-angle-double-down: "\f103";
|
||||
@fa-var-angle-double-left: "\f100";
|
||||
@fa-var-angle-double-right: "\f101";
|
||||
@fa-var-angle-double-up: "\f102";
|
||||
@fa-var-angle-down: "\f107";
|
||||
@fa-var-angle-left: "\f104";
|
||||
@fa-var-angle-right: "\f105";
|
||||
@fa-var-angle-up: "\f106";
|
||||
@fa-var-apple: "\f179";
|
||||
@fa-var-archive: "\f187";
|
||||
@fa-var-area-chart: "\f1fe";
|
||||
@fa-var-arrow-circle-down: "\f0ab";
|
||||
@fa-var-arrow-circle-left: "\f0a8";
|
||||
@fa-var-arrow-circle-o-down: "\f01a";
|
||||
@fa-var-arrow-circle-o-left: "\f190";
|
||||
@fa-var-arrow-circle-o-right: "\f18e";
|
||||
@fa-var-arrow-circle-o-up: "\f01b";
|
||||
@fa-var-arrow-circle-right: "\f0a9";
|
||||
@fa-var-arrow-circle-up: "\f0aa";
|
||||
@fa-var-arrow-down: "\f063";
|
||||
@fa-var-arrow-left: "\f060";
|
||||
@fa-var-arrow-right: "\f061";
|
||||
@fa-var-arrow-up: "\f062";
|
||||
@fa-var-arrows: "\f047";
|
||||
@fa-var-arrows-alt: "\f0b2";
|
||||
@fa-var-arrows-h: "\f07e";
|
||||
@fa-var-arrows-v: "\f07d";
|
||||
@fa-var-asterisk: "\f069";
|
||||
@fa-var-at: "\f1fa";
|
||||
@fa-var-automobile: "\f1b9";
|
||||
@fa-var-backward: "\f04a";
|
||||
@fa-var-ban: "\f05e";
|
||||
@fa-var-bank: "\f19c";
|
||||
@fa-var-bar-chart: "\f080";
|
||||
@fa-var-bar-chart-o: "\f080";
|
||||
@fa-var-barcode: "\f02a";
|
||||
@fa-var-bars: "\f0c9";
|
||||
@fa-var-beer: "\f0fc";
|
||||
@fa-var-behance: "\f1b4";
|
||||
@fa-var-behance-square: "\f1b5";
|
||||
@fa-var-bell: "\f0f3";
|
||||
@fa-var-bell-o: "\f0a2";
|
||||
@fa-var-bell-slash: "\f1f6";
|
||||
@fa-var-bell-slash-o: "\f1f7";
|
||||
@fa-var-bicycle: "\f206";
|
||||
@fa-var-binoculars: "\f1e5";
|
||||
@fa-var-birthday-cake: "\f1fd";
|
||||
@fa-var-bitbucket: "\f171";
|
||||
@fa-var-bitbucket-square: "\f172";
|
||||
@fa-var-bitcoin: "\f15a";
|
||||
@fa-var-bold: "\f032";
|
||||
@fa-var-bolt: "\f0e7";
|
||||
@fa-var-bomb: "\f1e2";
|
||||
@fa-var-book: "\f02d";
|
||||
@fa-var-bookmark: "\f02e";
|
||||
@fa-var-bookmark-o: "\f097";
|
||||
@fa-var-briefcase: "\f0b1";
|
||||
@fa-var-btc: "\f15a";
|
||||
@fa-var-bug: "\f188";
|
||||
@fa-var-building: "\f1ad";
|
||||
@fa-var-building-o: "\f0f7";
|
||||
@fa-var-bullhorn: "\f0a1";
|
||||
@fa-var-bullseye: "\f140";
|
||||
@fa-var-bus: "\f207";
|
||||
@fa-var-cab: "\f1ba";
|
||||
@fa-var-calculator: "\f1ec";
|
||||
@fa-var-calendar: "\f073";
|
||||
@fa-var-calendar-o: "\f133";
|
||||
@fa-var-camera: "\f030";
|
||||
@fa-var-camera-retro: "\f083";
|
||||
@fa-var-car: "\f1b9";
|
||||
@fa-var-caret-down: "\f0d7";
|
||||
@fa-var-caret-left: "\f0d9";
|
||||
@fa-var-caret-right: "\f0da";
|
||||
@fa-var-caret-square-o-down: "\f150";
|
||||
@fa-var-caret-square-o-left: "\f191";
|
||||
@fa-var-caret-square-o-right: "\f152";
|
||||
@fa-var-caret-square-o-up: "\f151";
|
||||
@fa-var-caret-up: "\f0d8";
|
||||
@fa-var-cc: "\f20a";
|
||||
@fa-var-cc-amex: "\f1f3";
|
||||
@fa-var-cc-discover: "\f1f2";
|
||||
@fa-var-cc-mastercard: "\f1f1";
|
||||
@fa-var-cc-paypal: "\f1f4";
|
||||
@fa-var-cc-stripe: "\f1f5";
|
||||
@fa-var-cc-visa: "\f1f0";
|
||||
@fa-var-certificate: "\f0a3";
|
||||
@fa-var-chain: "\f0c1";
|
||||
@fa-var-chain-broken: "\f127";
|
||||
@fa-var-check: "\f00c";
|
||||
@fa-var-check-circle: "\f058";
|
||||
@fa-var-check-circle-o: "\f05d";
|
||||
@fa-var-check-square: "\f14a";
|
||||
@fa-var-check-square-o: "\f046";
|
||||
@fa-var-chevron-circle-down: "\f13a";
|
||||
@fa-var-chevron-circle-left: "\f137";
|
||||
@fa-var-chevron-circle-right: "\f138";
|
||||
@fa-var-chevron-circle-up: "\f139";
|
||||
@fa-var-chevron-down: "\f078";
|
||||
@fa-var-chevron-left: "\f053";
|
||||
@fa-var-chevron-right: "\f054";
|
||||
@fa-var-chevron-up: "\f077";
|
||||
@fa-var-child: "\f1ae";
|
||||
@fa-var-circle: "\f111";
|
||||
@fa-var-circle-o: "\f10c";
|
||||
@fa-var-circle-o-notch: "\f1ce";
|
||||
@fa-var-circle-thin: "\f1db";
|
||||
@fa-var-clipboard: "\f0ea";
|
||||
@fa-var-clock-o: "\f017";
|
||||
@fa-var-close: "\f00d";
|
||||
@fa-var-cloud: "\f0c2";
|
||||
@fa-var-cloud-download: "\f0ed";
|
||||
@fa-var-cloud-upload: "\f0ee";
|
||||
@fa-var-cny: "\f157";
|
||||
@fa-var-code: "\f121";
|
||||
@fa-var-code-fork: "\f126";
|
||||
@fa-var-codepen: "\f1cb";
|
||||
@fa-var-coffee: "\f0f4";
|
||||
@fa-var-cog: "\f013";
|
||||
@fa-var-cogs: "\f085";
|
||||
@fa-var-columns: "\f0db";
|
||||
@fa-var-comment: "\f075";
|
||||
@fa-var-comment-o: "\f0e5";
|
||||
@fa-var-comments: "\f086";
|
||||
@fa-var-comments-o: "\f0e6";
|
||||
@fa-var-compass: "\f14e";
|
||||
@fa-var-compress: "\f066";
|
||||
@fa-var-copy: "\f0c5";
|
||||
@fa-var-copyright: "\f1f9";
|
||||
@fa-var-credit-card: "\f09d";
|
||||
@fa-var-crop: "\f125";
|
||||
@fa-var-crosshairs: "\f05b";
|
||||
@fa-var-css3: "\f13c";
|
||||
@fa-var-cube: "\f1b2";
|
||||
@fa-var-cubes: "\f1b3";
|
||||
@fa-var-cut: "\f0c4";
|
||||
@fa-var-cutlery: "\f0f5";
|
||||
@fa-var-dashboard: "\f0e4";
|
||||
@fa-var-database: "\f1c0";
|
||||
@fa-var-dedent: "\f03b";
|
||||
@fa-var-delicious: "\f1a5";
|
||||
@fa-var-desktop: "\f108";
|
||||
@fa-var-deviantart: "\f1bd";
|
||||
@fa-var-digg: "\f1a6";
|
||||
@fa-var-dollar: "\f155";
|
||||
@fa-var-dot-circle-o: "\f192";
|
||||
@fa-var-download: "\f019";
|
||||
@fa-var-dribbble: "\f17d";
|
||||
@fa-var-dropbox: "\f16b";
|
||||
@fa-var-drupal: "\f1a9";
|
||||
@fa-var-edit: "\f044";
|
||||
@fa-var-eject: "\f052";
|
||||
@fa-var-ellipsis-h: "\f141";
|
||||
@fa-var-ellipsis-v: "\f142";
|
||||
@fa-var-empire: "\f1d1";
|
||||
@fa-var-envelope: "\f0e0";
|
||||
@fa-var-envelope-o: "\f003";
|
||||
@fa-var-envelope-square: "\f199";
|
||||
@fa-var-eraser: "\f12d";
|
||||
@fa-var-eur: "\f153";
|
||||
@fa-var-euro: "\f153";
|
||||
@fa-var-exchange: "\f0ec";
|
||||
@fa-var-exclamation: "\f12a";
|
||||
@fa-var-exclamation-circle: "\f06a";
|
||||
@fa-var-exclamation-triangle: "\f071";
|
||||
@fa-var-expand: "\f065";
|
||||
@fa-var-external-link: "\f08e";
|
||||
@fa-var-external-link-square: "\f14c";
|
||||
@fa-var-eye: "\f06e";
|
||||
@fa-var-eye-slash: "\f070";
|
||||
@fa-var-eyedropper: "\f1fb";
|
||||
@fa-var-facebook: "\f09a";
|
||||
@fa-var-facebook-square: "\f082";
|
||||
@fa-var-fast-backward: "\f049";
|
||||
@fa-var-fast-forward: "\f050";
|
||||
@fa-var-fax: "\f1ac";
|
||||
@fa-var-female: "\f182";
|
||||
@fa-var-fighter-jet: "\f0fb";
|
||||
@fa-var-file: "\f15b";
|
||||
@fa-var-file-archive-o: "\f1c6";
|
||||
@fa-var-file-audio-o: "\f1c7";
|
||||
@fa-var-file-code-o: "\f1c9";
|
||||
@fa-var-file-excel-o: "\f1c3";
|
||||
@fa-var-file-image-o: "\f1c5";
|
||||
@fa-var-file-movie-o: "\f1c8";
|
||||
@fa-var-file-o: "\f016";
|
||||
@fa-var-file-pdf-o: "\f1c1";
|
||||
@fa-var-file-photo-o: "\f1c5";
|
||||
@fa-var-file-picture-o: "\f1c5";
|
||||
@fa-var-file-powerpoint-o: "\f1c4";
|
||||
@fa-var-file-sound-o: "\f1c7";
|
||||
@fa-var-file-text: "\f15c";
|
||||
@fa-var-file-text-o: "\f0f6";
|
||||
@fa-var-file-video-o: "\f1c8";
|
||||
@fa-var-file-word-o: "\f1c2";
|
||||
@fa-var-file-zip-o: "\f1c6";
|
||||
@fa-var-files-o: "\f0c5";
|
||||
@fa-var-film: "\f008";
|
||||
@fa-var-filter: "\f0b0";
|
||||
@fa-var-fire: "\f06d";
|
||||
@fa-var-fire-extinguisher: "\f134";
|
||||
@fa-var-flag: "\f024";
|
||||
@fa-var-flag-checkered: "\f11e";
|
||||
@fa-var-flag-o: "\f11d";
|
||||
@fa-var-flash: "\f0e7";
|
||||
@fa-var-flask: "\f0c3";
|
||||
@fa-var-flickr: "\f16e";
|
||||
@fa-var-floppy-o: "\f0c7";
|
||||
@fa-var-folder: "\f07b";
|
||||
@fa-var-folder-o: "\f114";
|
||||
@fa-var-folder-open: "\f07c";
|
||||
@fa-var-folder-open-o: "\f115";
|
||||
@fa-var-font: "\f031";
|
||||
@fa-var-forward: "\f04e";
|
||||
@fa-var-foursquare: "\f180";
|
||||
@fa-var-frown-o: "\f119";
|
||||
@fa-var-futbol-o: "\f1e3";
|
||||
@fa-var-gamepad: "\f11b";
|
||||
@fa-var-gavel: "\f0e3";
|
||||
@fa-var-gbp: "\f154";
|
||||
@fa-var-ge: "\f1d1";
|
||||
@fa-var-gear: "\f013";
|
||||
@fa-var-gears: "\f085";
|
||||
@fa-var-gift: "\f06b";
|
||||
@fa-var-git: "\f1d3";
|
||||
@fa-var-git-square: "\f1d2";
|
||||
@fa-var-github: "\f09b";
|
||||
@fa-var-github-alt: "\f113";
|
||||
@fa-var-github-square: "\f092";
|
||||
@fa-var-gittip: "\f184";
|
||||
@fa-var-glass: "\f000";
|
||||
@fa-var-globe: "\f0ac";
|
||||
@fa-var-google: "\f1a0";
|
||||
@fa-var-google-plus: "\f0d5";
|
||||
@fa-var-google-plus-square: "\f0d4";
|
||||
@fa-var-google-wallet: "\f1ee";
|
||||
@fa-var-graduation-cap: "\f19d";
|
||||
@fa-var-group: "\f0c0";
|
||||
@fa-var-h-square: "\f0fd";
|
||||
@fa-var-hacker-news: "\f1d4";
|
||||
@fa-var-hand-o-down: "\f0a7";
|
||||
@fa-var-hand-o-left: "\f0a5";
|
||||
@fa-var-hand-o-right: "\f0a4";
|
||||
@fa-var-hand-o-up: "\f0a6";
|
||||
@fa-var-hdd-o: "\f0a0";
|
||||
@fa-var-header: "\f1dc";
|
||||
@fa-var-headphones: "\f025";
|
||||
@fa-var-heart: "\f004";
|
||||
@fa-var-heart-o: "\f08a";
|
||||
@fa-var-history: "\f1da";
|
||||
@fa-var-home: "\f015";
|
||||
@fa-var-hospital-o: "\f0f8";
|
||||
@fa-var-html5: "\f13b";
|
||||
@fa-var-ils: "\f20b";
|
||||
@fa-var-image: "\f03e";
|
||||
@fa-var-inbox: "\f01c";
|
||||
@fa-var-indent: "\f03c";
|
||||
@fa-var-info: "\f129";
|
||||
@fa-var-info-circle: "\f05a";
|
||||
@fa-var-inr: "\f156";
|
||||
@fa-var-instagram: "\f16d";
|
||||
@fa-var-institution: "\f19c";
|
||||
@fa-var-ioxhost: "\f208";
|
||||
@fa-var-italic: "\f033";
|
||||
@fa-var-joomla: "\f1aa";
|
||||
@fa-var-jpy: "\f157";
|
||||
@fa-var-jsfiddle: "\f1cc";
|
||||
@fa-var-key: "\f084";
|
||||
@fa-var-keyboard-o: "\f11c";
|
||||
@fa-var-krw: "\f159";
|
||||
@fa-var-language: "\f1ab";
|
||||
@fa-var-laptop: "\f109";
|
||||
@fa-var-lastfm: "\f202";
|
||||
@fa-var-lastfm-square: "\f203";
|
||||
@fa-var-leaf: "\f06c";
|
||||
@fa-var-legal: "\f0e3";
|
||||
@fa-var-lemon-o: "\f094";
|
||||
@fa-var-level-down: "\f149";
|
||||
@fa-var-level-up: "\f148";
|
||||
@fa-var-life-bouy: "\f1cd";
|
||||
@fa-var-life-buoy: "\f1cd";
|
||||
@fa-var-life-ring: "\f1cd";
|
||||
@fa-var-life-saver: "\f1cd";
|
||||
@fa-var-lightbulb-o: "\f0eb";
|
||||
@fa-var-line-chart: "\f201";
|
||||
@fa-var-link: "\f0c1";
|
||||
@fa-var-linkedin: "\f0e1";
|
||||
@fa-var-linkedin-square: "\f08c";
|
||||
@fa-var-linux: "\f17c";
|
||||
@fa-var-list: "\f03a";
|
||||
@fa-var-list-alt: "\f022";
|
||||
@fa-var-list-ol: "\f0cb";
|
||||
@fa-var-list-ul: "\f0ca";
|
||||
@fa-var-location-arrow: "\f124";
|
||||
@fa-var-lock: "\f023";
|
||||
@fa-var-long-arrow-down: "\f175";
|
||||
@fa-var-long-arrow-left: "\f177";
|
||||
@fa-var-long-arrow-right: "\f178";
|
||||
@fa-var-long-arrow-up: "\f176";
|
||||
@fa-var-magic: "\f0d0";
|
||||
@fa-var-magnet: "\f076";
|
||||
@fa-var-mail-forward: "\f064";
|
||||
@fa-var-mail-reply: "\f112";
|
||||
@fa-var-mail-reply-all: "\f122";
|
||||
@fa-var-male: "\f183";
|
||||
@fa-var-map-marker: "\f041";
|
||||
@fa-var-maxcdn: "\f136";
|
||||
@fa-var-meanpath: "\f20c";
|
||||
@fa-var-medkit: "\f0fa";
|
||||
@fa-var-meh-o: "\f11a";
|
||||
@fa-var-microphone: "\f130";
|
||||
@fa-var-microphone-slash: "\f131";
|
||||
@fa-var-minus: "\f068";
|
||||
@fa-var-minus-circle: "\f056";
|
||||
@fa-var-minus-square: "\f146";
|
||||
@fa-var-minus-square-o: "\f147";
|
||||
@fa-var-mobile: "\f10b";
|
||||
@fa-var-mobile-phone: "\f10b";
|
||||
@fa-var-money: "\f0d6";
|
||||
@fa-var-moon-o: "\f186";
|
||||
@fa-var-mortar-board: "\f19d";
|
||||
@fa-var-music: "\f001";
|
||||
@fa-var-navicon: "\f0c9";
|
||||
@fa-var-newspaper-o: "\f1ea";
|
||||
@fa-var-openid: "\f19b";
|
||||
@fa-var-outdent: "\f03b";
|
||||
@fa-var-pagelines: "\f18c";
|
||||
@fa-var-paint-brush: "\f1fc";
|
||||
@fa-var-paper-plane: "\f1d8";
|
||||
@fa-var-paper-plane-o: "\f1d9";
|
||||
@fa-var-paperclip: "\f0c6";
|
||||
@fa-var-paragraph: "\f1dd";
|
||||
@fa-var-paste: "\f0ea";
|
||||
@fa-var-pause: "\f04c";
|
||||
@fa-var-paw: "\f1b0";
|
||||
@fa-var-paypal: "\f1ed";
|
||||
@fa-var-pencil: "\f040";
|
||||
@fa-var-pencil-square: "\f14b";
|
||||
@fa-var-pencil-square-o: "\f044";
|
||||
@fa-var-phone: "\f095";
|
||||
@fa-var-phone-square: "\f098";
|
||||
@fa-var-photo: "\f03e";
|
||||
@fa-var-picture-o: "\f03e";
|
||||
@fa-var-pie-chart: "\f200";
|
||||
@fa-var-pied-piper: "\f1a7";
|
||||
@fa-var-pied-piper-alt: "\f1a8";
|
||||
@fa-var-pinterest: "\f0d2";
|
||||
@fa-var-pinterest-square: "\f0d3";
|
||||
@fa-var-plane: "\f072";
|
||||
@fa-var-play: "\f04b";
|
||||
@fa-var-play-circle: "\f144";
|
||||
@fa-var-play-circle-o: "\f01d";
|
||||
@fa-var-plug: "\f1e6";
|
||||
@fa-var-plus: "\f067";
|
||||
@fa-var-plus-circle: "\f055";
|
||||
@fa-var-plus-square: "\f0fe";
|
||||
@fa-var-plus-square-o: "\f196";
|
||||
@fa-var-power-off: "\f011";
|
||||
@fa-var-print: "\f02f";
|
||||
@fa-var-puzzle-piece: "\f12e";
|
||||
@fa-var-qq: "\f1d6";
|
||||
@fa-var-qrcode: "\f029";
|
||||
@fa-var-question: "\f128";
|
||||
@fa-var-question-circle: "\f059";
|
||||
@fa-var-quote-left: "\f10d";
|
||||
@fa-var-quote-right: "\f10e";
|
||||
@fa-var-ra: "\f1d0";
|
||||
@fa-var-random: "\f074";
|
||||
@fa-var-rebel: "\f1d0";
|
||||
@fa-var-recycle: "\f1b8";
|
||||
@fa-var-reddit: "\f1a1";
|
||||
@fa-var-reddit-square: "\f1a2";
|
||||
@fa-var-refresh: "\f021";
|
||||
@fa-var-remove: "\f00d";
|
||||
@fa-var-renren: "\f18b";
|
||||
@fa-var-reorder: "\f0c9";
|
||||
@fa-var-repeat: "\f01e";
|
||||
@fa-var-reply: "\f112";
|
||||
@fa-var-reply-all: "\f122";
|
||||
@fa-var-retweet: "\f079";
|
||||
@fa-var-rmb: "\f157";
|
||||
@fa-var-road: "\f018";
|
||||
@fa-var-rocket: "\f135";
|
||||
@fa-var-rotate-left: "\f0e2";
|
||||
@fa-var-rotate-right: "\f01e";
|
||||
@fa-var-rouble: "\f158";
|
||||
@fa-var-rss: "\f09e";
|
||||
@fa-var-rss-square: "\f143";
|
||||
@fa-var-rub: "\f158";
|
||||
@fa-var-ruble: "\f158";
|
||||
@fa-var-rupee: "\f156";
|
||||
@fa-var-save: "\f0c7";
|
||||
@fa-var-scissors: "\f0c4";
|
||||
@fa-var-search: "\f002";
|
||||
@fa-var-search-minus: "\f010";
|
||||
@fa-var-search-plus: "\f00e";
|
||||
@fa-var-send: "\f1d8";
|
||||
@fa-var-send-o: "\f1d9";
|
||||
@fa-var-share: "\f064";
|
||||
@fa-var-share-alt: "\f1e0";
|
||||
@fa-var-share-alt-square: "\f1e1";
|
||||
@fa-var-share-square: "\f14d";
|
||||
@fa-var-share-square-o: "\f045";
|
||||
@fa-var-shekel: "\f20b";
|
||||
@fa-var-sheqel: "\f20b";
|
||||
@fa-var-shield: "\f132";
|
||||
@fa-var-shopping-cart: "\f07a";
|
||||
@fa-var-sign-in: "\f090";
|
||||
@fa-var-sign-out: "\f08b";
|
||||
@fa-var-signal: "\f012";
|
||||
@fa-var-sitemap: "\f0e8";
|
||||
@fa-var-skype: "\f17e";
|
||||
@fa-var-slack: "\f198";
|
||||
@fa-var-sliders: "\f1de";
|
||||
@fa-var-slideshare: "\f1e7";
|
||||
@fa-var-smile-o: "\f118";
|
||||
@fa-var-soccer-ball-o: "\f1e3";
|
||||
@fa-var-sort: "\f0dc";
|
||||
@fa-var-sort-alpha-asc: "\f15d";
|
||||
@fa-var-sort-alpha-desc: "\f15e";
|
||||
@fa-var-sort-amount-asc: "\f160";
|
||||
@fa-var-sort-amount-desc: "\f161";
|
||||
@fa-var-sort-asc: "\f0de";
|
||||
@fa-var-sort-desc: "\f0dd";
|
||||
@fa-var-sort-down: "\f0dd";
|
||||
@fa-var-sort-numeric-asc: "\f162";
|
||||
@fa-var-sort-numeric-desc: "\f163";
|
||||
@fa-var-sort-up: "\f0de";
|
||||
@fa-var-soundcloud: "\f1be";
|
||||
@fa-var-space-shuttle: "\f197";
|
||||
@fa-var-spinner: "\f110";
|
||||
@fa-var-spoon: "\f1b1";
|
||||
@fa-var-spotify: "\f1bc";
|
||||
@fa-var-square: "\f0c8";
|
||||
@fa-var-square-o: "\f096";
|
||||
@fa-var-stack-exchange: "\f18d";
|
||||
@fa-var-stack-overflow: "\f16c";
|
||||
@fa-var-star: "\f005";
|
||||
@fa-var-star-half: "\f089";
|
||||
@fa-var-star-half-empty: "\f123";
|
||||
@fa-var-star-half-full: "\f123";
|
||||
@fa-var-star-half-o: "\f123";
|
||||
@fa-var-star-o: "\f006";
|
||||
@fa-var-steam: "\f1b6";
|
||||
@fa-var-steam-square: "\f1b7";
|
||||
@fa-var-step-backward: "\f048";
|
||||
@fa-var-step-forward: "\f051";
|
||||
@fa-var-stethoscope: "\f0f1";
|
||||
@fa-var-stop: "\f04d";
|
||||
@fa-var-strikethrough: "\f0cc";
|
||||
@fa-var-stumbleupon: "\f1a4";
|
||||
@fa-var-stumbleupon-circle: "\f1a3";
|
||||
@fa-var-subscript: "\f12c";
|
||||
@fa-var-suitcase: "\f0f2";
|
||||
@fa-var-sun-o: "\f185";
|
||||
@fa-var-superscript: "\f12b";
|
||||
@fa-var-support: "\f1cd";
|
||||
@fa-var-table: "\f0ce";
|
||||
@fa-var-tablet: "\f10a";
|
||||
@fa-var-tachometer: "\f0e4";
|
||||
@fa-var-tag: "\f02b";
|
||||
@fa-var-tags: "\f02c";
|
||||
@fa-var-tasks: "\f0ae";
|
||||
@fa-var-taxi: "\f1ba";
|
||||
@fa-var-tencent-weibo: "\f1d5";
|
||||
@fa-var-terminal: "\f120";
|
||||
@fa-var-text-height: "\f034";
|
||||
@fa-var-text-width: "\f035";
|
||||
@fa-var-th: "\f00a";
|
||||
@fa-var-th-large: "\f009";
|
||||
@fa-var-th-list: "\f00b";
|
||||
@fa-var-thumb-tack: "\f08d";
|
||||
@fa-var-thumbs-down: "\f165";
|
||||
@fa-var-thumbs-o-down: "\f088";
|
||||
@fa-var-thumbs-o-up: "\f087";
|
||||
@fa-var-thumbs-up: "\f164";
|
||||
@fa-var-ticket: "\f145";
|
||||
@fa-var-times: "\f00d";
|
||||
@fa-var-times-circle: "\f057";
|
||||
@fa-var-times-circle-o: "\f05c";
|
||||
@fa-var-tint: "\f043";
|
||||
@fa-var-toggle-down: "\f150";
|
||||
@fa-var-toggle-left: "\f191";
|
||||
@fa-var-toggle-off: "\f204";
|
||||
@fa-var-toggle-on: "\f205";
|
||||
@fa-var-toggle-right: "\f152";
|
||||
@fa-var-toggle-up: "\f151";
|
||||
@fa-var-trash: "\f1f8";
|
||||
@fa-var-trash-o: "\f014";
|
||||
@fa-var-tree: "\f1bb";
|
||||
@fa-var-trello: "\f181";
|
||||
@fa-var-trophy: "\f091";
|
||||
@fa-var-truck: "\f0d1";
|
||||
@fa-var-try: "\f195";
|
||||
@fa-var-tty: "\f1e4";
|
||||
@fa-var-tumblr: "\f173";
|
||||
@fa-var-tumblr-square: "\f174";
|
||||
@fa-var-turkish-lira: "\f195";
|
||||
@fa-var-twitch: "\f1e8";
|
||||
@fa-var-twitter: "\f099";
|
||||
@fa-var-twitter-square: "\f081";
|
||||
@fa-var-umbrella: "\f0e9";
|
||||
@fa-var-underline: "\f0cd";
|
||||
@fa-var-undo: "\f0e2";
|
||||
@fa-var-university: "\f19c";
|
||||
@fa-var-unlink: "\f127";
|
||||
@fa-var-unlock: "\f09c";
|
||||
@fa-var-unlock-alt: "\f13e";
|
||||
@fa-var-unsorted: "\f0dc";
|
||||
@fa-var-upload: "\f093";
|
||||
@fa-var-usd: "\f155";
|
||||
@fa-var-user: "\f007";
|
||||
@fa-var-user-md: "\f0f0";
|
||||
@fa-var-users: "\f0c0";
|
||||
@fa-var-video-camera: "\f03d";
|
||||
@fa-var-vimeo-square: "\f194";
|
||||
@fa-var-vine: "\f1ca";
|
||||
@fa-var-vk: "\f189";
|
||||
@fa-var-volume-down: "\f027";
|
||||
@fa-var-volume-off: "\f026";
|
||||
@fa-var-volume-up: "\f028";
|
||||
@fa-var-warning: "\f071";
|
||||
@fa-var-wechat: "\f1d7";
|
||||
@fa-var-weibo: "\f18a";
|
||||
@fa-var-weixin: "\f1d7";
|
||||
@fa-var-wheelchair: "\f193";
|
||||
@fa-var-wifi: "\f1eb";
|
||||
@fa-var-windows: "\f17a";
|
||||
@fa-var-won: "\f159";
|
||||
@fa-var-wordpress: "\f19a";
|
||||
@fa-var-wrench: "\f0ad";
|
||||
@fa-var-xing: "\f168";
|
||||
@fa-var-xing-square: "\f169";
|
||||
@fa-var-yahoo: "\f19e";
|
||||
@fa-var-yelp: "\f1e9";
|
||||
@fa-var-yen: "\f157";
|
||||
@fa-var-youtube: "\f167";
|
||||
@fa-var-youtube-play: "\f16a";
|
||||
@fa-var-youtube-square: "\f166";
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
// Bordered & Pulled
|
||||
// -------------------------
|
||||
|
||||
.#{$fa-css-prefix}-border {
|
||||
padding: .2em .25em .15em;
|
||||
border: solid .08em $fa-border-color;
|
||||
border-radius: .1em;
|
||||
}
|
||||
|
||||
.pull-right { float: right; }
|
||||
.pull-left { float: left; }
|
||||
|
||||
.#{$fa-css-prefix} {
|
||||
&.pull-left { margin-right: .3em; }
|
||||
&.pull-right { margin-left: .3em; }
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
// Base Class Definition
|
||||
// -------------------------
|
||||
|
||||
.#{$fa-css-prefix} {
|
||||
display: inline-block;
|
||||
font: normal normal normal 14px/1 FontAwesome; // shortening font declaration
|
||||
font-size: inherit; // can't have font-size inherit on line above, so need to override
|
||||
text-rendering: auto; // optimizelegibility throws things off #1094
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
// Fixed Width Icons
|
||||
// -------------------------
|
||||
.#{$fa-css-prefix}-fw {
|
||||
width: (18em / 14);
|
||||
text-align: center;
|
||||
}
|
552
hosting/static/hosting/font-awesome/scss/_icons.scss
vendored
552
hosting/static/hosting/font-awesome/scss/_icons.scss
vendored
|
@ -1,552 +0,0 @@
|
|||
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
|
||||
readers do not read off random characters that represent icons */
|
||||
|
||||
.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }
|
||||
.#{$fa-css-prefix}-music:before { content: $fa-var-music; }
|
||||
.#{$fa-css-prefix}-search:before { content: $fa-var-search; }
|
||||
.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }
|
||||
.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }
|
||||
.#{$fa-css-prefix}-star:before { content: $fa-var-star; }
|
||||
.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }
|
||||
.#{$fa-css-prefix}-user:before { content: $fa-var-user; }
|
||||
.#{$fa-css-prefix}-film:before { content: $fa-var-film; }
|
||||
.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }
|
||||
.#{$fa-css-prefix}-th:before { content: $fa-var-th; }
|
||||
.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }
|
||||
.#{$fa-css-prefix}-check:before { content: $fa-var-check; }
|
||||
.#{$fa-css-prefix}-remove:before,
|
||||
.#{$fa-css-prefix}-close:before,
|
||||
.#{$fa-css-prefix}-times:before { content: $fa-var-times; }
|
||||
.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }
|
||||
.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }
|
||||
.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }
|
||||
.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }
|
||||
.#{$fa-css-prefix}-gear:before,
|
||||
.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }
|
||||
.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }
|
||||
.#{$fa-css-prefix}-home:before { content: $fa-var-home; }
|
||||
.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }
|
||||
.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }
|
||||
.#{$fa-css-prefix}-road:before { content: $fa-var-road; }
|
||||
.#{$fa-css-prefix}-download:before { content: $fa-var-download; }
|
||||
.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }
|
||||
.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }
|
||||
.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }
|
||||
.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }
|
||||
.#{$fa-css-prefix}-rotate-right:before,
|
||||
.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }
|
||||
.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }
|
||||
.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }
|
||||
.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }
|
||||
.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }
|
||||
.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }
|
||||
.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }
|
||||
.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }
|
||||
.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }
|
||||
.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }
|
||||
.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }
|
||||
.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }
|
||||
.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }
|
||||
.#{$fa-css-prefix}-book:before { content: $fa-var-book; }
|
||||
.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }
|
||||
.#{$fa-css-prefix}-print:before { content: $fa-var-print; }
|
||||
.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }
|
||||
.#{$fa-css-prefix}-font:before { content: $fa-var-font; }
|
||||
.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }
|
||||
.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }
|
||||
.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }
|
||||
.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }
|
||||
.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }
|
||||
.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }
|
||||
.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }
|
||||
.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }
|
||||
.#{$fa-css-prefix}-list:before { content: $fa-var-list; }
|
||||
.#{$fa-css-prefix}-dedent:before,
|
||||
.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }
|
||||
.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }
|
||||
.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }
|
||||
.#{$fa-css-prefix}-photo:before,
|
||||
.#{$fa-css-prefix}-image:before,
|
||||
.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }
|
||||
.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }
|
||||
.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }
|
||||
.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }
|
||||
.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }
|
||||
.#{$fa-css-prefix}-edit:before,
|
||||
.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }
|
||||
.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }
|
||||
.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }
|
||||
.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }
|
||||
.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }
|
||||
.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }
|
||||
.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }
|
||||
.#{$fa-css-prefix}-play:before { content: $fa-var-play; }
|
||||
.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }
|
||||
.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }
|
||||
.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }
|
||||
.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }
|
||||
.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }
|
||||
.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }
|
||||
.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }
|
||||
.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }
|
||||
.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }
|
||||
.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }
|
||||
.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }
|
||||
.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }
|
||||
.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }
|
||||
.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }
|
||||
.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }
|
||||
.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }
|
||||
.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }
|
||||
.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }
|
||||
.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }
|
||||
.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }
|
||||
.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }
|
||||
.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }
|
||||
.#{$fa-css-prefix}-mail-forward:before,
|
||||
.#{$fa-css-prefix}-share:before { content: $fa-var-share; }
|
||||
.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }
|
||||
.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }
|
||||
.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }
|
||||
.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }
|
||||
.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }
|
||||
.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }
|
||||
.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }
|
||||
.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }
|
||||
.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }
|
||||
.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }
|
||||
.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }
|
||||
.#{$fa-css-prefix}-warning:before,
|
||||
.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }
|
||||
.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }
|
||||
.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }
|
||||
.#{$fa-css-prefix}-random:before { content: $fa-var-random; }
|
||||
.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }
|
||||
.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }
|
||||
.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }
|
||||
.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }
|
||||
.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }
|
||||
.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }
|
||||
.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }
|
||||
.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }
|
||||
.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }
|
||||
.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }
|
||||
.#{$fa-css-prefix}-bar-chart-o:before,
|
||||
.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }
|
||||
.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }
|
||||
.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }
|
||||
.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }
|
||||
.#{$fa-css-prefix}-key:before { content: $fa-var-key; }
|
||||
.#{$fa-css-prefix}-gears:before,
|
||||
.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }
|
||||
.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }
|
||||
.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }
|
||||
.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }
|
||||
.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }
|
||||
.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }
|
||||
.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }
|
||||
.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }
|
||||
.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }
|
||||
.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }
|
||||
.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }
|
||||
.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }
|
||||
.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }
|
||||
.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }
|
||||
.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }
|
||||
.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }
|
||||
.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }
|
||||
.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }
|
||||
.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }
|
||||
.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }
|
||||
.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }
|
||||
.#{$fa-css-prefix}-github:before { content: $fa-var-github; }
|
||||
.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }
|
||||
.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }
|
||||
.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }
|
||||
.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }
|
||||
.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }
|
||||
.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }
|
||||
.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }
|
||||
.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }
|
||||
.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }
|
||||
.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }
|
||||
.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }
|
||||
.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }
|
||||
.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }
|
||||
.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }
|
||||
.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }
|
||||
.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }
|
||||
.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }
|
||||
.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }
|
||||
.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }
|
||||
.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }
|
||||
.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }
|
||||
.#{$fa-css-prefix}-group:before,
|
||||
.#{$fa-css-prefix}-users:before { content: $fa-var-users; }
|
||||
.#{$fa-css-prefix}-chain:before,
|
||||
.#{$fa-css-prefix}-link:before { content: $fa-var-link; }
|
||||
.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }
|
||||
.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }
|
||||
.#{$fa-css-prefix}-cut:before,
|
||||
.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }
|
||||
.#{$fa-css-prefix}-copy:before,
|
||||
.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }
|
||||
.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }
|
||||
.#{$fa-css-prefix}-save:before,
|
||||
.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }
|
||||
.#{$fa-css-prefix}-square:before { content: $fa-var-square; }
|
||||
.#{$fa-css-prefix}-navicon:before,
|
||||
.#{$fa-css-prefix}-reorder:before,
|
||||
.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }
|
||||
.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }
|
||||
.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }
|
||||
.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }
|
||||
.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }
|
||||
.#{$fa-css-prefix}-table:before { content: $fa-var-table; }
|
||||
.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }
|
||||
.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }
|
||||
.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }
|
||||
.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }
|
||||
.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }
|
||||
.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }
|
||||
.#{$fa-css-prefix}-money:before { content: $fa-var-money; }
|
||||
.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }
|
||||
.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }
|
||||
.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }
|
||||
.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }
|
||||
.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }
|
||||
.#{$fa-css-prefix}-unsorted:before,
|
||||
.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }
|
||||
.#{$fa-css-prefix}-sort-down:before,
|
||||
.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }
|
||||
.#{$fa-css-prefix}-sort-up:before,
|
||||
.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }
|
||||
.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }
|
||||
.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }
|
||||
.#{$fa-css-prefix}-rotate-left:before,
|
||||
.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }
|
||||
.#{$fa-css-prefix}-legal:before,
|
||||
.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }
|
||||
.#{$fa-css-prefix}-dashboard:before,
|
||||
.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }
|
||||
.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }
|
||||
.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }
|
||||
.#{$fa-css-prefix}-flash:before,
|
||||
.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }
|
||||
.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }
|
||||
.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }
|
||||
.#{$fa-css-prefix}-paste:before,
|
||||
.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }
|
||||
.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }
|
||||
.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }
|
||||
.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }
|
||||
.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }
|
||||
.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }
|
||||
.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }
|
||||
.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }
|
||||
.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }
|
||||
.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }
|
||||
.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }
|
||||
.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }
|
||||
.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }
|
||||
.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }
|
||||
.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }
|
||||
.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }
|
||||
.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }
|
||||
.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }
|
||||
.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }
|
||||
.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }
|
||||
.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }
|
||||
.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }
|
||||
.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }
|
||||
.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }
|
||||
.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }
|
||||
.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }
|
||||
.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }
|
||||
.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }
|
||||
.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }
|
||||
.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }
|
||||
.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }
|
||||
.#{$fa-css-prefix}-mobile-phone:before,
|
||||
.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }
|
||||
.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }
|
||||
.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }
|
||||
.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }
|
||||
.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }
|
||||
.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }
|
||||
.#{$fa-css-prefix}-mail-reply:before,
|
||||
.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }
|
||||
.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }
|
||||
.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }
|
||||
.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }
|
||||
.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }
|
||||
.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }
|
||||
.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }
|
||||
.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }
|
||||
.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }
|
||||
.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }
|
||||
.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }
|
||||
.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }
|
||||
.#{$fa-css-prefix}-code:before { content: $fa-var-code; }
|
||||
.#{$fa-css-prefix}-mail-reply-all:before,
|
||||
.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }
|
||||
.#{$fa-css-prefix}-star-half-empty:before,
|
||||
.#{$fa-css-prefix}-star-half-full:before,
|
||||
.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }
|
||||
.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }
|
||||
.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }
|
||||
.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }
|
||||
.#{$fa-css-prefix}-unlink:before,
|
||||
.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }
|
||||
.#{$fa-css-prefix}-question:before { content: $fa-var-question; }
|
||||
.#{$fa-css-prefix}-info:before { content: $fa-var-info; }
|
||||
.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }
|
||||
.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }
|
||||
.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }
|
||||
.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }
|
||||
.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }
|
||||
.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }
|
||||
.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }
|
||||
.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }
|
||||
.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }
|
||||
.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }
|
||||
.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }
|
||||
.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }
|
||||
.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }
|
||||
.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }
|
||||
.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }
|
||||
.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }
|
||||
.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }
|
||||
.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }
|
||||
.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }
|
||||
.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }
|
||||
.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }
|
||||
.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }
|
||||
.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }
|
||||
.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }
|
||||
.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }
|
||||
.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }
|
||||
.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }
|
||||
.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }
|
||||
.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }
|
||||
.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }
|
||||
.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }
|
||||
.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }
|
||||
.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }
|
||||
.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }
|
||||
.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }
|
||||
.#{$fa-css-prefix}-toggle-down:before,
|
||||
.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }
|
||||
.#{$fa-css-prefix}-toggle-up:before,
|
||||
.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }
|
||||
.#{$fa-css-prefix}-toggle-right:before,
|
||||
.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }
|
||||
.#{$fa-css-prefix}-euro:before,
|
||||
.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }
|
||||
.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }
|
||||
.#{$fa-css-prefix}-dollar:before,
|
||||
.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }
|
||||
.#{$fa-css-prefix}-rupee:before,
|
||||
.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }
|
||||
.#{$fa-css-prefix}-cny:before,
|
||||
.#{$fa-css-prefix}-rmb:before,
|
||||
.#{$fa-css-prefix}-yen:before,
|
||||
.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }
|
||||
.#{$fa-css-prefix}-ruble:before,
|
||||
.#{$fa-css-prefix}-rouble:before,
|
||||
.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }
|
||||
.#{$fa-css-prefix}-won:before,
|
||||
.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }
|
||||
.#{$fa-css-prefix}-bitcoin:before,
|
||||
.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }
|
||||
.#{$fa-css-prefix}-file:before { content: $fa-var-file; }
|
||||
.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }
|
||||
.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }
|
||||
.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }
|
||||
.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }
|
||||
.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }
|
||||
.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }
|
||||
.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }
|
||||
.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }
|
||||
.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }
|
||||
.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }
|
||||
.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }
|
||||
.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }
|
||||
.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }
|
||||
.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }
|
||||
.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }
|
||||
.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }
|
||||
.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }
|
||||
.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }
|
||||
.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }
|
||||
.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }
|
||||
.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }
|
||||
.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }
|
||||
.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }
|
||||
.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }
|
||||
.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }
|
||||
.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }
|
||||
.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }
|
||||
.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }
|
||||
.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }
|
||||
.#{$fa-css-prefix}-android:before { content: $fa-var-android; }
|
||||
.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }
|
||||
.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }
|
||||
.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }
|
||||
.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }
|
||||
.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }
|
||||
.#{$fa-css-prefix}-female:before { content: $fa-var-female; }
|
||||
.#{$fa-css-prefix}-male:before { content: $fa-var-male; }
|
||||
.#{$fa-css-prefix}-gittip:before { content: $fa-var-gittip; }
|
||||
.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }
|
||||
.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }
|
||||
.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }
|
||||
.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }
|
||||
.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }
|
||||
.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }
|
||||
.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }
|
||||
.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }
|
||||
.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }
|
||||
.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }
|
||||
.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }
|
||||
.#{$fa-css-prefix}-toggle-left:before,
|
||||
.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }
|
||||
.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }
|
||||
.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }
|
||||
.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }
|
||||
.#{$fa-css-prefix}-turkish-lira:before,
|
||||
.#{$fa-css-prefix}-try:before { content: $fa-var-try; }
|
||||
.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }
|
||||
.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }
|
||||
.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }
|
||||
.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }
|
||||
.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }
|
||||
.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }
|
||||
.#{$fa-css-prefix}-institution:before,
|
||||
.#{$fa-css-prefix}-bank:before,
|
||||
.#{$fa-css-prefix}-university:before { content: $fa-var-university; }
|
||||
.#{$fa-css-prefix}-mortar-board:before,
|
||||
.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }
|
||||
.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }
|
||||
.#{$fa-css-prefix}-google:before { content: $fa-var-google; }
|
||||
.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }
|
||||
.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }
|
||||
.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }
|
||||
.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }
|
||||
.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }
|
||||
.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }
|
||||
.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }
|
||||
.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }
|
||||
.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }
|
||||
.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }
|
||||
.#{$fa-css-prefix}-language:before { content: $fa-var-language; }
|
||||
.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }
|
||||
.#{$fa-css-prefix}-building:before { content: $fa-var-building; }
|
||||
.#{$fa-css-prefix}-child:before { content: $fa-var-child; }
|
||||
.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }
|
||||
.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }
|
||||
.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }
|
||||
.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }
|
||||
.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }
|
||||
.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }
|
||||
.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }
|
||||
.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }
|
||||
.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }
|
||||
.#{$fa-css-prefix}-automobile:before,
|
||||
.#{$fa-css-prefix}-car:before { content: $fa-var-car; }
|
||||
.#{$fa-css-prefix}-cab:before,
|
||||
.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }
|
||||
.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }
|
||||
.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }
|
||||
.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }
|
||||
.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }
|
||||
.#{$fa-css-prefix}-database:before { content: $fa-var-database; }
|
||||
.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }
|
||||
.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }
|
||||
.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }
|
||||
.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }
|
||||
.#{$fa-css-prefix}-file-photo-o:before,
|
||||
.#{$fa-css-prefix}-file-picture-o:before,
|
||||
.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }
|
||||
.#{$fa-css-prefix}-file-zip-o:before,
|
||||
.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }
|
||||
.#{$fa-css-prefix}-file-sound-o:before,
|
||||
.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }
|
||||
.#{$fa-css-prefix}-file-movie-o:before,
|
||||
.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }
|
||||
.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }
|
||||
.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }
|
||||
.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }
|
||||
.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }
|
||||
.#{$fa-css-prefix}-life-bouy:before,
|
||||
.#{$fa-css-prefix}-life-buoy:before,
|
||||
.#{$fa-css-prefix}-life-saver:before,
|
||||
.#{$fa-css-prefix}-support:before,
|
||||
.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }
|
||||
.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }
|
||||
.#{$fa-css-prefix}-ra:before,
|
||||
.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }
|
||||
.#{$fa-css-prefix}-ge:before,
|
||||
.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }
|
||||
.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }
|
||||
.#{$fa-css-prefix}-git:before { content: $fa-var-git; }
|
||||
.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }
|
||||
.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }
|
||||
.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }
|
||||
.#{$fa-css-prefix}-wechat:before,
|
||||
.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }
|
||||
.#{$fa-css-prefix}-send:before,
|
||||
.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }
|
||||
.#{$fa-css-prefix}-send-o:before,
|
||||
.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }
|
||||
.#{$fa-css-prefix}-history:before { content: $fa-var-history; }
|
||||
.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }
|
||||
.#{$fa-css-prefix}-header:before { content: $fa-var-header; }
|
||||
.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }
|
||||
.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }
|
||||
.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }
|
||||
.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }
|
||||
.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }
|
||||
.#{$fa-css-prefix}-soccer-ball-o:before,
|
||||
.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }
|
||||
.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }
|
||||
.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }
|
||||
.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }
|
||||
.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }
|
||||
.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }
|
||||
.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }
|
||||
.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }
|
||||
.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }
|
||||
.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }
|
||||
.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }
|
||||
.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }
|
||||
.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }
|
||||
.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }
|
||||
.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }
|
||||
.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }
|
||||
.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }
|
||||
.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }
|
||||
.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }
|
||||
.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }
|
||||
.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }
|
||||
.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }
|
||||
.#{$fa-css-prefix}-at:before { content: $fa-var-at; }
|
||||
.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }
|
||||
.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }
|
||||
.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }
|
||||
.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }
|
||||
.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }
|
||||
.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }
|
||||
.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }
|
||||
.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }
|
||||
.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }
|
||||
.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }
|
||||
.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }
|
||||
.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }
|
||||
.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }
|
||||
.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }
|
||||
.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }
|
||||
.#{$fa-css-prefix}-shekel:before,
|
||||
.#{$fa-css-prefix}-sheqel:before,
|
||||
.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }
|
||||
.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }
|
|
@ -1,13 +0,0 @@
|
|||
// Icon Sizes
|
||||
// -------------------------
|
||||
|
||||
/* makes the font 33% larger relative to the icon container */
|
||||
.#{$fa-css-prefix}-lg {
|
||||
font-size: (4em / 3);
|
||||
line-height: (3em / 4);
|
||||
vertical-align: -15%;
|
||||
}
|
||||
.#{$fa-css-prefix}-2x { font-size: 2em; }
|
||||
.#{$fa-css-prefix}-3x { font-size: 3em; }
|
||||
.#{$fa-css-prefix}-4x { font-size: 4em; }
|
||||
.#{$fa-css-prefix}-5x { font-size: 5em; }
|
|
@ -1,19 +0,0 @@
|
|||
// List Icons
|
||||
// -------------------------
|
||||
|
||||
.#{$fa-css-prefix}-ul {
|
||||
padding-left: 0;
|
||||
margin-left: $fa-li-width;
|
||||
list-style-type: none;
|
||||
> li { position: relative; }
|
||||
}
|
||||
.#{$fa-css-prefix}-li {
|
||||
position: absolute;
|
||||
left: -$fa-li-width;
|
||||
width: $fa-li-width;
|
||||
top: (2em / 14);
|
||||
text-align: center;
|
||||
&.#{$fa-css-prefix}-lg {
|
||||
left: -$fa-li-width + (4em / 14);
|
||||
}
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
// Mixins
|
||||
// --------------------------
|
||||
|
||||
@mixin fa-icon() {
|
||||
display: inline-block;
|
||||
font: normal normal normal 14px/1 FontAwesome; // shortening font declaration
|
||||
font-size: inherit; // can't have font-size inherit on line above, so need to override
|
||||
text-rendering: auto; // optimizelegibility throws things off #1094
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
@mixin fa-icon-rotate($degrees, $rotation) {
|
||||
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
|
||||
-webkit-transform: rotate($degrees);
|
||||
-ms-transform: rotate($degrees);
|
||||
transform: rotate($degrees);
|
||||
}
|
||||
|
||||
@mixin fa-icon-flip($horiz, $vert, $rotation) {
|
||||
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
|
||||
-webkit-transform: scale($horiz, $vert);
|
||||
-ms-transform: scale($horiz, $vert);
|
||||
transform: scale($horiz, $vert);
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
/* FONT PATH
|
||||
* -------------------------- */
|
||||
|
||||
@font-face {
|
||||
font-family: 'FontAwesome';
|
||||
src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
|
||||
src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
|
||||
url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
|
||||
url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
|
||||
url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
|
||||
//src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
// Rotated & Flipped Icons
|
||||
// -------------------------
|
||||
|
||||
.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
|
||||
.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
|
||||
.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
|
||||
|
||||
.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
|
||||
.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
|
||||
|
||||
// Hook for IE8-9
|
||||
// -------------------------
|
||||
|
||||
:root .#{$fa-css-prefix}-rotate-90,
|
||||
:root .#{$fa-css-prefix}-rotate-180,
|
||||
:root .#{$fa-css-prefix}-rotate-270,
|
||||
:root .#{$fa-css-prefix}-flip-horizontal,
|
||||
:root .#{$fa-css-prefix}-flip-vertical {
|
||||
filter: none;
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
// Spinning Icons
|
||||
// --------------------------
|
||||
|
||||
.#{$fa-css-prefix}-spin {
|
||||
-webkit-animation: fa-spin 2s infinite linear;
|
||||
animation: fa-spin 2s infinite linear;
|
||||
}
|
||||
|
||||
@-webkit-keyframes fa-spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
-webkit-transform: rotate(359deg);
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fa-spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
-webkit-transform: rotate(359deg);
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
// Stacked Icons
|
||||
// -------------------------
|
||||
|
||||
.#{$fa-css-prefix}-stack {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 2em;
|
||||
height: 2em;
|
||||
line-height: 2em;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
.#{$fa-css-prefix}-stack-1x { line-height: inherit; }
|
||||
.#{$fa-css-prefix}-stack-2x { font-size: 2em; }
|
||||
.#{$fa-css-prefix}-inverse { color: $fa-inverse; }
|
|
@ -1,561 +0,0 @@
|
|||
// Variables
|
||||
// --------------------------
|
||||
|
||||
$fa-font-path: "../fonts" !default;
|
||||
//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts" !default; // for referencing Bootstrap CDN font files directly
|
||||
$fa-css-prefix: fa !default;
|
||||
$fa-version: "4.2.0" !default;
|
||||
$fa-border-color: #eee !default;
|
||||
$fa-inverse: #fff !default;
|
||||
$fa-li-width: (30em / 14) !default;
|
||||
|
||||
$fa-var-adjust: "\f042";
|
||||
$fa-var-adn: "\f170";
|
||||
$fa-var-align-center: "\f037";
|
||||
$fa-var-align-justify: "\f039";
|
||||
$fa-var-align-left: "\f036";
|
||||
$fa-var-align-right: "\f038";
|
||||
$fa-var-ambulance: "\f0f9";
|
||||
$fa-var-anchor: "\f13d";
|
||||
$fa-var-android: "\f17b";
|
||||
$fa-var-angellist: "\f209";
|
||||
$fa-var-angle-double-down: "\f103";
|
||||
$fa-var-angle-double-left: "\f100";
|
||||
$fa-var-angle-double-right: "\f101";
|
||||
$fa-var-angle-double-up: "\f102";
|
||||
$fa-var-angle-down: "\f107";
|
||||
$fa-var-angle-left: "\f104";
|
||||
$fa-var-angle-right: "\f105";
|
||||
$fa-var-angle-up: "\f106";
|
||||
$fa-var-apple: "\f179";
|
||||
$fa-var-archive: "\f187";
|
||||
$fa-var-area-chart: "\f1fe";
|
||||
$fa-var-arrow-circle-down: "\f0ab";
|
||||
$fa-var-arrow-circle-left: "\f0a8";
|
||||
$fa-var-arrow-circle-o-down: "\f01a";
|
||||
$fa-var-arrow-circle-o-left: "\f190";
|
||||
$fa-var-arrow-circle-o-right: "\f18e";
|
||||
$fa-var-arrow-circle-o-up: "\f01b";
|
||||
$fa-var-arrow-circle-right: "\f0a9";
|
||||
$fa-var-arrow-circle-up: "\f0aa";
|
||||
$fa-var-arrow-down: "\f063";
|
||||
$fa-var-arrow-left: "\f060";
|
||||
$fa-var-arrow-right: "\f061";
|
||||
$fa-var-arrow-up: "\f062";
|
||||
$fa-var-arrows: "\f047";
|
||||
$fa-var-arrows-alt: "\f0b2";
|
||||
$fa-var-arrows-h: "\f07e";
|
||||
$fa-var-arrows-v: "\f07d";
|
||||
$fa-var-asterisk: "\f069";
|
||||
$fa-var-at: "\f1fa";
|
||||
$fa-var-automobile: "\f1b9";
|
||||
$fa-var-backward: "\f04a";
|
||||
$fa-var-ban: "\f05e";
|
||||
$fa-var-bank: "\f19c";
|
||||
$fa-var-bar-chart: "\f080";
|
||||
$fa-var-bar-chart-o: "\f080";
|
||||
$fa-var-barcode: "\f02a";
|
||||
$fa-var-bars: "\f0c9";
|
||||
$fa-var-beer: "\f0fc";
|
||||
$fa-var-behance: "\f1b4";
|
||||
$fa-var-behance-square: "\f1b5";
|
||||
$fa-var-bell: "\f0f3";
|
||||
$fa-var-bell-o: "\f0a2";
|
||||
$fa-var-bell-slash: "\f1f6";
|
||||
$fa-var-bell-slash-o: "\f1f7";
|
||||
$fa-var-bicycle: "\f206";
|
||||
$fa-var-binoculars: "\f1e5";
|
||||
$fa-var-birthday-cake: "\f1fd";
|
||||
$fa-var-bitbucket: "\f171";
|
||||
$fa-var-bitbucket-square: "\f172";
|
||||
$fa-var-bitcoin: "\f15a";
|
||||
$fa-var-bold: "\f032";
|
||||
$fa-var-bolt: "\f0e7";
|
||||
$fa-var-bomb: "\f1e2";
|
||||
$fa-var-book: "\f02d";
|
||||
$fa-var-bookmark: "\f02e";
|
||||
$fa-var-bookmark-o: "\f097";
|
||||
$fa-var-briefcase: "\f0b1";
|
||||
$fa-var-btc: "\f15a";
|
||||
$fa-var-bug: "\f188";
|
||||
$fa-var-building: "\f1ad";
|
||||
$fa-var-building-o: "\f0f7";
|
||||
$fa-var-bullhorn: "\f0a1";
|
||||
$fa-var-bullseye: "\f140";
|
||||
$fa-var-bus: "\f207";
|
||||
$fa-var-cab: "\f1ba";
|
||||
$fa-var-calculator: "\f1ec";
|
||||
$fa-var-calendar: "\f073";
|
||||
$fa-var-calendar-o: "\f133";
|
||||
$fa-var-camera: "\f030";
|
||||
$fa-var-camera-retro: "\f083";
|
||||
$fa-var-car: "\f1b9";
|
||||
$fa-var-caret-down: "\f0d7";
|
||||
$fa-var-caret-left: "\f0d9";
|
||||
$fa-var-caret-right: "\f0da";
|
||||
$fa-var-caret-square-o-down: "\f150";
|
||||
$fa-var-caret-square-o-left: "\f191";
|
||||
$fa-var-caret-square-o-right: "\f152";
|
||||
$fa-var-caret-square-o-up: "\f151";
|
||||
$fa-var-caret-up: "\f0d8";
|
||||
$fa-var-cc: "\f20a";
|
||||
$fa-var-cc-amex: "\f1f3";
|
||||
$fa-var-cc-discover: "\f1f2";
|
||||
$fa-var-cc-mastercard: "\f1f1";
|
||||
$fa-var-cc-paypal: "\f1f4";
|
||||
$fa-var-cc-stripe: "\f1f5";
|
||||
$fa-var-cc-visa: "\f1f0";
|
||||
$fa-var-certificate: "\f0a3";
|
||||
$fa-var-chain: "\f0c1";
|
||||
$fa-var-chain-broken: "\f127";
|
||||
$fa-var-check: "\f00c";
|
||||
$fa-var-check-circle: "\f058";
|
||||
$fa-var-check-circle-o: "\f05d";
|
||||
$fa-var-check-square: "\f14a";
|
||||
$fa-var-check-square-o: "\f046";
|
||||
$fa-var-chevron-circle-down: "\f13a";
|
||||
$fa-var-chevron-circle-left: "\f137";
|
||||
$fa-var-chevron-circle-right: "\f138";
|
||||
$fa-var-chevron-circle-up: "\f139";
|
||||
$fa-var-chevron-down: "\f078";
|
||||
$fa-var-chevron-left: "\f053";
|
||||
$fa-var-chevron-right: "\f054";
|
||||
$fa-var-chevron-up: "\f077";
|
||||
$fa-var-child: "\f1ae";
|
||||
$fa-var-circle: "\f111";
|
||||
$fa-var-circle-o: "\f10c";
|
||||
$fa-var-circle-o-notch: "\f1ce";
|
||||
$fa-var-circle-thin: "\f1db";
|
||||
$fa-var-clipboard: "\f0ea";
|
||||
$fa-var-clock-o: "\f017";
|
||||
$fa-var-close: "\f00d";
|
||||
$fa-var-cloud: "\f0c2";
|
||||
$fa-var-cloud-download: "\f0ed";
|
||||
$fa-var-cloud-upload: "\f0ee";
|
||||
$fa-var-cny: "\f157";
|
||||
$fa-var-code: "\f121";
|
||||
$fa-var-code-fork: "\f126";
|
||||
$fa-var-codepen: "\f1cb";
|
||||
$fa-var-coffee: "\f0f4";
|
||||
$fa-var-cog: "\f013";
|
||||
$fa-var-cogs: "\f085";
|
||||
$fa-var-columns: "\f0db";
|
||||
$fa-var-comment: "\f075";
|
||||
$fa-var-comment-o: "\f0e5";
|
||||
$fa-var-comments: "\f086";
|
||||
$fa-var-comments-o: "\f0e6";
|
||||
$fa-var-compass: "\f14e";
|
||||
$fa-var-compress: "\f066";
|
||||
$fa-var-copy: "\f0c5";
|
||||
$fa-var-copyright: "\f1f9";
|
||||
$fa-var-credit-card: "\f09d";
|
||||
$fa-var-crop: "\f125";
|
||||
$fa-var-crosshairs: "\f05b";
|
||||
$fa-var-css3: "\f13c";
|
||||
$fa-var-cube: "\f1b2";
|
||||
$fa-var-cubes: "\f1b3";
|
||||
$fa-var-cut: "\f0c4";
|
||||
$fa-var-cutlery: "\f0f5";
|
||||
$fa-var-dashboard: "\f0e4";
|
||||
$fa-var-database: "\f1c0";
|
||||
$fa-var-dedent: "\f03b";
|
||||
$fa-var-delicious: "\f1a5";
|
||||
$fa-var-desktop: "\f108";
|
||||
$fa-var-deviantart: "\f1bd";
|
||||
$fa-var-digg: "\f1a6";
|
||||
$fa-var-dollar: "\f155";
|
||||
$fa-var-dot-circle-o: "\f192";
|
||||
$fa-var-download: "\f019";
|
||||
$fa-var-dribbble: "\f17d";
|
||||
$fa-var-dropbox: "\f16b";
|
||||
$fa-var-drupal: "\f1a9";
|
||||
$fa-var-edit: "\f044";
|
||||
$fa-var-eject: "\f052";
|
||||
$fa-var-ellipsis-h: "\f141";
|
||||
$fa-var-ellipsis-v: "\f142";
|
||||
$fa-var-empire: "\f1d1";
|
||||
$fa-var-envelope: "\f0e0";
|
||||
$fa-var-envelope-o: "\f003";
|
||||
$fa-var-envelope-square: "\f199";
|
||||
$fa-var-eraser: "\f12d";
|
||||
$fa-var-eur: "\f153";
|
||||
$fa-var-euro: "\f153";
|
||||
$fa-var-exchange: "\f0ec";
|
||||
$fa-var-exclamation: "\f12a";
|
||||
$fa-var-exclamation-circle: "\f06a";
|
||||
$fa-var-exclamation-triangle: "\f071";
|
||||
$fa-var-expand: "\f065";
|
||||
$fa-var-external-link: "\f08e";
|
||||
$fa-var-external-link-square: "\f14c";
|
||||
$fa-var-eye: "\f06e";
|
||||
$fa-var-eye-slash: "\f070";
|
||||
$fa-var-eyedropper: "\f1fb";
|
||||
$fa-var-facebook: "\f09a";
|
||||
$fa-var-facebook-square: "\f082";
|
||||
$fa-var-fast-backward: "\f049";
|
||||
$fa-var-fast-forward: "\f050";
|
||||
$fa-var-fax: "\f1ac";
|
||||
$fa-var-female: "\f182";
|
||||
$fa-var-fighter-jet: "\f0fb";
|
||||
$fa-var-file: "\f15b";
|
||||
$fa-var-file-archive-o: "\f1c6";
|
||||
$fa-var-file-audio-o: "\f1c7";
|
||||
$fa-var-file-code-o: "\f1c9";
|
||||
$fa-var-file-excel-o: "\f1c3";
|
||||
$fa-var-file-image-o: "\f1c5";
|
||||
$fa-var-file-movie-o: "\f1c8";
|
||||
$fa-var-file-o: "\f016";
|
||||
$fa-var-file-pdf-o: "\f1c1";
|
||||
$fa-var-file-photo-o: "\f1c5";
|
||||
$fa-var-file-picture-o: "\f1c5";
|
||||
$fa-var-file-powerpoint-o: "\f1c4";
|
||||
$fa-var-file-sound-o: "\f1c7";
|
||||
$fa-var-file-text: "\f15c";
|
||||
$fa-var-file-text-o: "\f0f6";
|
||||
$fa-var-file-video-o: "\f1c8";
|
||||
$fa-var-file-word-o: "\f1c2";
|
||||
$fa-var-file-zip-o: "\f1c6";
|
||||
$fa-var-files-o: "\f0c5";
|
||||
$fa-var-film: "\f008";
|
||||
$fa-var-filter: "\f0b0";
|
||||
$fa-var-fire: "\f06d";
|
||||
$fa-var-fire-extinguisher: "\f134";
|
||||
$fa-var-flag: "\f024";
|
||||
$fa-var-flag-checkered: "\f11e";
|
||||
$fa-var-flag-o: "\f11d";
|
||||
$fa-var-flash: "\f0e7";
|
||||
$fa-var-flask: "\f0c3";
|
||||
$fa-var-flickr: "\f16e";
|
||||
$fa-var-floppy-o: "\f0c7";
|
||||
$fa-var-folder: "\f07b";
|
||||
$fa-var-folder-o: "\f114";
|
||||
$fa-var-folder-open: "\f07c";
|
||||
$fa-var-folder-open-o: "\f115";
|
||||
$fa-var-font: "\f031";
|
||||
$fa-var-forward: "\f04e";
|
||||
$fa-var-foursquare: "\f180";
|
||||
$fa-var-frown-o: "\f119";
|
||||
$fa-var-futbol-o: "\f1e3";
|
||||
$fa-var-gamepad: "\f11b";
|
||||
$fa-var-gavel: "\f0e3";
|
||||
$fa-var-gbp: "\f154";
|
||||
$fa-var-ge: "\f1d1";
|
||||
$fa-var-gear: "\f013";
|
||||
$fa-var-gears: "\f085";
|
||||
$fa-var-gift: "\f06b";
|
||||
$fa-var-git: "\f1d3";
|
||||
$fa-var-git-square: "\f1d2";
|
||||
$fa-var-github: "\f09b";
|
||||
$fa-var-github-alt: "\f113";
|
||||
$fa-var-github-square: "\f092";
|
||||
$fa-var-gittip: "\f184";
|
||||
$fa-var-glass: "\f000";
|
||||
$fa-var-globe: "\f0ac";
|
||||
$fa-var-google: "\f1a0";
|
||||
$fa-var-google-plus: "\f0d5";
|
||||
$fa-var-google-plus-square: "\f0d4";
|
||||
$fa-var-google-wallet: "\f1ee";
|
||||
$fa-var-graduation-cap: "\f19d";
|
||||
$fa-var-group: "\f0c0";
|
||||
$fa-var-h-square: "\f0fd";
|
||||
$fa-var-hacker-news: "\f1d4";
|
||||
$fa-var-hand-o-down: "\f0a7";
|
||||
$fa-var-hand-o-left: "\f0a5";
|
||||
$fa-var-hand-o-right: "\f0a4";
|
||||
$fa-var-hand-o-up: "\f0a6";
|
||||
$fa-var-hdd-o: "\f0a0";
|
||||
$fa-var-header: "\f1dc";
|
||||
$fa-var-headphones: "\f025";
|
||||
$fa-var-heart: "\f004";
|
||||
$fa-var-heart-o: "\f08a";
|
||||
$fa-var-history: "\f1da";
|
||||
$fa-var-home: "\f015";
|
||||
$fa-var-hospital-o: "\f0f8";
|
||||
$fa-var-html5: "\f13b";
|
||||
$fa-var-ils: "\f20b";
|
||||
$fa-var-image: "\f03e";
|
||||
$fa-var-inbox: "\f01c";
|
||||
$fa-var-indent: "\f03c";
|
||||
$fa-var-info: "\f129";
|
||||
$fa-var-info-circle: "\f05a";
|
||||
$fa-var-inr: "\f156";
|
||||
$fa-var-instagram: "\f16d";
|
||||
$fa-var-institution: "\f19c";
|
||||
$fa-var-ioxhost: "\f208";
|
||||
$fa-var-italic: "\f033";
|
||||
$fa-var-joomla: "\f1aa";
|
||||
$fa-var-jpy: "\f157";
|
||||
$fa-var-jsfiddle: "\f1cc";
|
||||
$fa-var-key: "\f084";
|
||||
$fa-var-keyboard-o: "\f11c";
|
||||
$fa-var-krw: "\f159";
|
||||
$fa-var-language: "\f1ab";
|
||||
$fa-var-laptop: "\f109";
|
||||
$fa-var-lastfm: "\f202";
|
||||
$fa-var-lastfm-square: "\f203";
|
||||
$fa-var-leaf: "\f06c";
|
||||
$fa-var-legal: "\f0e3";
|
||||
$fa-var-lemon-o: "\f094";
|
||||
$fa-var-level-down: "\f149";
|
||||
$fa-var-level-up: "\f148";
|
||||
$fa-var-life-bouy: "\f1cd";
|
||||
$fa-var-life-buoy: "\f1cd";
|
||||
$fa-var-life-ring: "\f1cd";
|
||||
$fa-var-life-saver: "\f1cd";
|
||||
$fa-var-lightbulb-o: "\f0eb";
|
||||
$fa-var-line-chart: "\f201";
|
||||
$fa-var-link: "\f0c1";
|
||||
$fa-var-linkedin: "\f0e1";
|
||||
$fa-var-linkedin-square: "\f08c";
|
||||
$fa-var-linux: "\f17c";
|
||||
$fa-var-list: "\f03a";
|
||||
$fa-var-list-alt: "\f022";
|
||||
$fa-var-list-ol: "\f0cb";
|
||||
$fa-var-list-ul: "\f0ca";
|
||||
$fa-var-location-arrow: "\f124";
|
||||
$fa-var-lock: "\f023";
|
||||
$fa-var-long-arrow-down: "\f175";
|
||||
$fa-var-long-arrow-left: "\f177";
|
||||
$fa-var-long-arrow-right: "\f178";
|
||||
$fa-var-long-arrow-up: "\f176";
|
||||
$fa-var-magic: "\f0d0";
|
||||
$fa-var-magnet: "\f076";
|
||||
$fa-var-mail-forward: "\f064";
|
||||
$fa-var-mail-reply: "\f112";
|
||||
$fa-var-mail-reply-all: "\f122";
|
||||
$fa-var-male: "\f183";
|
||||
$fa-var-map-marker: "\f041";
|
||||
$fa-var-maxcdn: "\f136";
|
||||
$fa-var-meanpath: "\f20c";
|
||||
$fa-var-medkit: "\f0fa";
|
||||
$fa-var-meh-o: "\f11a";
|
||||
$fa-var-microphone: "\f130";
|
||||
$fa-var-microphone-slash: "\f131";
|
||||
$fa-var-minus: "\f068";
|
||||
$fa-var-minus-circle: "\f056";
|
||||
$fa-var-minus-square: "\f146";
|
||||
$fa-var-minus-square-o: "\f147";
|
||||
$fa-var-mobile: "\f10b";
|
||||
$fa-var-mobile-phone: "\f10b";
|
||||
$fa-var-money: "\f0d6";
|
||||
$fa-var-moon-o: "\f186";
|
||||
$fa-var-mortar-board: "\f19d";
|
||||
$fa-var-music: "\f001";
|
||||
$fa-var-navicon: "\f0c9";
|
||||
$fa-var-newspaper-o: "\f1ea";
|
||||
$fa-var-openid: "\f19b";
|
||||
$fa-var-outdent: "\f03b";
|
||||
$fa-var-pagelines: "\f18c";
|
||||
$fa-var-paint-brush: "\f1fc";
|
||||
$fa-var-paper-plane: "\f1d8";
|
||||
$fa-var-paper-plane-o: "\f1d9";
|
||||
$fa-var-paperclip: "\f0c6";
|
||||
$fa-var-paragraph: "\f1dd";
|
||||
$fa-var-paste: "\f0ea";
|
||||
$fa-var-pause: "\f04c";
|
||||
$fa-var-paw: "\f1b0";
|
||||
$fa-var-paypal: "\f1ed";
|
||||
$fa-var-pencil: "\f040";
|
||||
$fa-var-pencil-square: "\f14b";
|
||||
$fa-var-pencil-square-o: "\f044";
|
||||
$fa-var-phone: "\f095";
|
||||
$fa-var-phone-square: "\f098";
|
||||
$fa-var-photo: "\f03e";
|
||||
$fa-var-picture-o: "\f03e";
|
||||
$fa-var-pie-chart: "\f200";
|
||||
$fa-var-pied-piper: "\f1a7";
|
||||
$fa-var-pied-piper-alt: "\f1a8";
|
||||
$fa-var-pinterest: "\f0d2";
|
||||
$fa-var-pinterest-square: "\f0d3";
|
||||
$fa-var-plane: "\f072";
|
||||
$fa-var-play: "\f04b";
|
||||
$fa-var-play-circle: "\f144";
|
||||
$fa-var-play-circle-o: "\f01d";
|
||||
$fa-var-plug: "\f1e6";
|
||||
$fa-var-plus: "\f067";
|
||||
$fa-var-plus-circle: "\f055";
|
||||
$fa-var-plus-square: "\f0fe";
|
||||
$fa-var-plus-square-o: "\f196";
|
||||
$fa-var-power-off: "\f011";
|
||||
$fa-var-print: "\f02f";
|
||||
$fa-var-puzzle-piece: "\f12e";
|
||||
$fa-var-qq: "\f1d6";
|
||||
$fa-var-qrcode: "\f029";
|
||||
$fa-var-question: "\f128";
|
||||
$fa-var-question-circle: "\f059";
|
||||
$fa-var-quote-left: "\f10d";
|
||||
$fa-var-quote-right: "\f10e";
|
||||
$fa-var-ra: "\f1d0";
|
||||
$fa-var-random: "\f074";
|
||||
$fa-var-rebel: "\f1d0";
|
||||
$fa-var-recycle: "\f1b8";
|
||||
$fa-var-reddit: "\f1a1";
|
||||
$fa-var-reddit-square: "\f1a2";
|
||||
$fa-var-refresh: "\f021";
|
||||
$fa-var-remove: "\f00d";
|
||||
$fa-var-renren: "\f18b";
|
||||
$fa-var-reorder: "\f0c9";
|
||||
$fa-var-repeat: "\f01e";
|
||||
$fa-var-reply: "\f112";
|
||||
$fa-var-reply-all: "\f122";
|
||||
$fa-var-retweet: "\f079";
|
||||
$fa-var-rmb: "\f157";
|
||||
$fa-var-road: "\f018";
|
||||
$fa-var-rocket: "\f135";
|
||||
$fa-var-rotate-left: "\f0e2";
|
||||
$fa-var-rotate-right: "\f01e";
|
||||
$fa-var-rouble: "\f158";
|
||||
$fa-var-rss: "\f09e";
|
||||
$fa-var-rss-square: "\f143";
|
||||
$fa-var-rub: "\f158";
|
||||
$fa-var-ruble: "\f158";
|
||||
$fa-var-rupee: "\f156";
|
||||
$fa-var-save: "\f0c7";
|
||||
$fa-var-scissors: "\f0c4";
|
||||
$fa-var-search: "\f002";
|
||||
$fa-var-search-minus: "\f010";
|
||||
$fa-var-search-plus: "\f00e";
|
||||
$fa-var-send: "\f1d8";
|
||||
$fa-var-send-o: "\f1d9";
|
||||
$fa-var-share: "\f064";
|
||||
$fa-var-share-alt: "\f1e0";
|
||||
$fa-var-share-alt-square: "\f1e1";
|
||||
$fa-var-share-square: "\f14d";
|
||||
$fa-var-share-square-o: "\f045";
|
||||
$fa-var-shekel: "\f20b";
|
||||
$fa-var-sheqel: "\f20b";
|
||||
$fa-var-shield: "\f132";
|
||||
$fa-var-shopping-cart: "\f07a";
|
||||
$fa-var-sign-in: "\f090";
|
||||
$fa-var-sign-out: "\f08b";
|
||||
$fa-var-signal: "\f012";
|
||||
$fa-var-sitemap: "\f0e8";
|
||||
$fa-var-skype: "\f17e";
|
||||
$fa-var-slack: "\f198";
|
||||
$fa-var-sliders: "\f1de";
|
||||
$fa-var-slideshare: "\f1e7";
|
||||
$fa-var-smile-o: "\f118";
|
||||
$fa-var-soccer-ball-o: "\f1e3";
|
||||
$fa-var-sort: "\f0dc";
|
||||
$fa-var-sort-alpha-asc: "\f15d";
|
||||
$fa-var-sort-alpha-desc: "\f15e";
|
||||
$fa-var-sort-amount-asc: "\f160";
|
||||
$fa-var-sort-amount-desc: "\f161";
|
||||
$fa-var-sort-asc: "\f0de";
|
||||
$fa-var-sort-desc: "\f0dd";
|
||||
$fa-var-sort-down: "\f0dd";
|
||||
$fa-var-sort-numeric-asc: "\f162";
|
||||
$fa-var-sort-numeric-desc: "\f163";
|
||||
$fa-var-sort-up: "\f0de";
|
||||
$fa-var-soundcloud: "\f1be";
|
||||
$fa-var-space-shuttle: "\f197";
|
||||
$fa-var-spinner: "\f110";
|
||||
$fa-var-spoon: "\f1b1";
|
||||
$fa-var-spotify: "\f1bc";
|
||||
$fa-var-square: "\f0c8";
|
||||
$fa-var-square-o: "\f096";
|
||||
$fa-var-stack-exchange: "\f18d";
|
||||
$fa-var-stack-overflow: "\f16c";
|
||||
$fa-var-star: "\f005";
|
||||
$fa-var-star-half: "\f089";
|
||||
$fa-var-star-half-empty: "\f123";
|
||||
$fa-var-star-half-full: "\f123";
|
||||
$fa-var-star-half-o: "\f123";
|
||||
$fa-var-star-o: "\f006";
|
||||
$fa-var-steam: "\f1b6";
|
||||
$fa-var-steam-square: "\f1b7";
|
||||
$fa-var-step-backward: "\f048";
|
||||
$fa-var-step-forward: "\f051";
|
||||
$fa-var-stethoscope: "\f0f1";
|
||||
$fa-var-stop: "\f04d";
|
||||
$fa-var-strikethrough: "\f0cc";
|
||||
$fa-var-stumbleupon: "\f1a4";
|
||||
$fa-var-stumbleupon-circle: "\f1a3";
|
||||
$fa-var-subscript: "\f12c";
|
||||
$fa-var-suitcase: "\f0f2";
|
||||
$fa-var-sun-o: "\f185";
|
||||
$fa-var-superscript: "\f12b";
|
||||
$fa-var-support: "\f1cd";
|
||||
$fa-var-table: "\f0ce";
|
||||
$fa-var-tablet: "\f10a";
|
||||
$fa-var-tachometer: "\f0e4";
|
||||
$fa-var-tag: "\f02b";
|
||||
$fa-var-tags: "\f02c";
|
||||
$fa-var-tasks: "\f0ae";
|
||||
$fa-var-taxi: "\f1ba";
|
||||
$fa-var-tencent-weibo: "\f1d5";
|
||||
$fa-var-terminal: "\f120";
|
||||
$fa-var-text-height: "\f034";
|
||||
$fa-var-text-width: "\f035";
|
||||
$fa-var-th: "\f00a";
|
||||
$fa-var-th-large: "\f009";
|
||||
$fa-var-th-list: "\f00b";
|
||||
$fa-var-thumb-tack: "\f08d";
|
||||
$fa-var-thumbs-down: "\f165";
|
||||
$fa-var-thumbs-o-down: "\f088";
|
||||
$fa-var-thumbs-o-up: "\f087";
|
||||
$fa-var-thumbs-up: "\f164";
|
||||
$fa-var-ticket: "\f145";
|
||||
$fa-var-times: "\f00d";
|
||||
$fa-var-times-circle: "\f057";
|
||||
$fa-var-times-circle-o: "\f05c";
|
||||
$fa-var-tint: "\f043";
|
||||
$fa-var-toggle-down: "\f150";
|
||||
$fa-var-toggle-left: "\f191";
|
||||
$fa-var-toggle-off: "\f204";
|
||||
$fa-var-toggle-on: "\f205";
|
||||
$fa-var-toggle-right: "\f152";
|
||||
$fa-var-toggle-up: "\f151";
|
||||
$fa-var-trash: "\f1f8";
|
||||
$fa-var-trash-o: "\f014";
|
||||
$fa-var-tree: "\f1bb";
|
||||
$fa-var-trello: "\f181";
|
||||
$fa-var-trophy: "\f091";
|
||||
$fa-var-truck: "\f0d1";
|
||||
$fa-var-try: "\f195";
|
||||
$fa-var-tty: "\f1e4";
|
||||
$fa-var-tumblr: "\f173";
|
||||
$fa-var-tumblr-square: "\f174";
|
||||
$fa-var-turkish-lira: "\f195";
|
||||
$fa-var-twitch: "\f1e8";
|
||||
$fa-var-twitter: "\f099";
|
||||
$fa-var-twitter-square: "\f081";
|
||||
$fa-var-umbrella: "\f0e9";
|
||||
$fa-var-underline: "\f0cd";
|
||||
$fa-var-undo: "\f0e2";
|
||||
$fa-var-university: "\f19c";
|
||||
$fa-var-unlink: "\f127";
|
||||
$fa-var-unlock: "\f09c";
|
||||
$fa-var-unlock-alt: "\f13e";
|
||||
$fa-var-unsorted: "\f0dc";
|
||||
$fa-var-upload: "\f093";
|
||||
$fa-var-usd: "\f155";
|
||||
$fa-var-user: "\f007";
|
||||
$fa-var-user-md: "\f0f0";
|
||||
$fa-var-users: "\f0c0";
|
||||
$fa-var-video-camera: "\f03d";
|
||||
$fa-var-vimeo-square: "\f194";
|
||||
$fa-var-vine: "\f1ca";
|
||||
$fa-var-vk: "\f189";
|
||||
$fa-var-volume-down: "\f027";
|
||||
$fa-var-volume-off: "\f026";
|
||||
$fa-var-volume-up: "\f028";
|
||||
$fa-var-warning: "\f071";
|
||||
$fa-var-wechat: "\f1d7";
|
||||
$fa-var-weibo: "\f18a";
|
||||
$fa-var-weixin: "\f1d7";
|
||||
$fa-var-wheelchair: "\f193";
|
||||
$fa-var-wifi: "\f1eb";
|
||||
$fa-var-windows: "\f17a";
|
||||
$fa-var-won: "\f159";
|
||||
$fa-var-wordpress: "\f19a";
|
||||
$fa-var-wrench: "\f0ad";
|
||||
$fa-var-xing: "\f168";
|
||||
$fa-var-xing-square: "\f169";
|
||||
$fa-var-yahoo: "\f19e";
|
||||
$fa-var-yelp: "\f1e9";
|
||||
$fa-var-yen: "\f157";
|
||||
$fa-var-youtube: "\f167";
|
||||
$fa-var-youtube-play: "\f16a";
|
||||
$fa-var-youtube-square: "\f166";
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
/*!
|
||||
* Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
|
||||
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
|
||||
*/
|
||||
|
||||
@import "variables";
|
||||
@import "mixins";
|
||||
@import "path";
|
||||
@import "core";
|
||||
@import "larger";
|
||||
@import "fixed-width";
|
||||
@import "list";
|
||||
@import "bordered-pulled";
|
||||
@import "spinning";
|
||||
@import "rotated-flipped";
|
||||
@import "stacked";
|
||||
@import "icons";
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,4 +1,4 @@
|
|||
{% load static i18n %}
|
||||
{% load static i18n cms_tags sekizai_tags %}
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
@ -14,7 +14,7 @@
|
|||
<title>ungleich</title>
|
||||
|
||||
<!-- Bootstrap Core CSS -->
|
||||
<link href="{% static 'hosting/css/bootstrap-3.3.7.min.css' %}" rel="stylesheet">
|
||||
<link href="{% static 'datacenterlight/css/bootstrap-3.3.7.min.css' %}" rel="stylesheet">
|
||||
|
||||
<!-- Custom CSS -->
|
||||
<link href="{% static 'hosting/css/landing-page.css' %}" rel="stylesheet">
|
||||
|
@ -29,14 +29,14 @@
|
|||
{% block css_extra %}
|
||||
{% endblock css_extra %}
|
||||
|
||||
{# {% render_block "css" postprocessor "compressor.contrib.sekizai.compress" %}#}
|
||||
{# {% render_block "js" postprocessor "compressor.contrib.sekizai.compress" %}#}
|
||||
{% render_block "css" postprocessor "compressor.contrib.sekizai.compress" %}
|
||||
{% render_block "js" postprocessor "compressor.contrib.sekizai.compress" %}
|
||||
|
||||
<!-- Custom Fonts -->
|
||||
<link href='//fonts.googleapis.com/css?family=Raleway' rel='stylesheet' type='text/css'>
|
||||
<link href="{% static 'hosting/font-awesome/css/font-awesome.min.css' %}" rel="stylesheet" type="text/css">
|
||||
<link href="{% static 'datacenterlight/font-awesome/css/font-awesome.min.css' %}" rel="stylesheet" type="text/css">
|
||||
<link href="//fonts.googleapis.com/css?family=Lato:300,400,500,700,300italic,400italic,700italic" rel="stylesheet" type="text/css">
|
||||
<link rel="shortcut icon" href="{% static 'hosting/img/favicon.ico' %}" type="image/x-icon" />
|
||||
<link rel="shortcut icon" href="{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon" />
|
||||
|
||||
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
||||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||
|
@ -52,7 +52,7 @@
|
|||
|
||||
<body>
|
||||
{% include "gdpr_banner.html" %}
|
||||
{# {% cms_toolbar %}#}
|
||||
{% cms_toolbar %}
|
||||
|
||||
{% block navbar %}
|
||||
{% include "hosting/includes/_navbar_user.html" %}
|
||||
|
@ -72,17 +72,17 @@
|
|||
</footer>
|
||||
{% else %}
|
||||
<div class="footer-light">
|
||||
{% include "hosting/includes/_footer.html" %}
|
||||
{% include "datacenterlight/includes/_footer.html" %}
|
||||
</div>
|
||||
{% endif %}
|
||||
<!-- jQuery -->
|
||||
<script src="{% static 'hosting/js/jquery-2.2.4.min.js' %}"></script>
|
||||
<script src="{% static 'datacenterlight/js/jquery-2.2.4.min.js' %}"></script>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.16.0/jquery.validate.min.js"></script>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/1000hz-bootstrap-validator/0.11.9/validator.min.js"></script>
|
||||
<!-- Copy Clipboard -->
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.5.10/clipboard.min.js"></script>
|
||||
<!-- Bootstrap Core JavaScript -->
|
||||
<script src="{% static 'hosting/js/bootstrap-3.3.7.min.js' %}"></script>
|
||||
<script src="{% static 'datacenterlight/js/bootstrap-3.3.7.min.js' %}"></script>
|
||||
|
||||
<!-- Virtual Machine Detail Javascript -->
|
||||
<script src="{% static 'hosting/js/virtual_machine_detail.js' %}"></script>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{% extends "hosting/base_short.html" %}
|
||||
{% load staticfiles bootstrap3 i18n cms_tags %}
|
||||
{% load static bootstrap3 i18n cms_tags %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
|
|
|
@ -11,31 +11,31 @@
|
|||
{% trans "Welcome" %} {{request.user.name}}
|
||||
</div>
|
||||
<div class="hosting-dashboard-content">
|
||||
<a href="{% url 'hosting:dashboard' %}" class="hosting-dashboard-item">
|
||||
<a href="{% url 'hosting:create_virtual_machine' %}" class="hosting-dashboard-item">
|
||||
<h2>{% trans "Create VM" %}</h2>
|
||||
<div class="hosting-dashboard-image">
|
||||
<img class="svg-img" src="{% static 'hosting/img/plusVM.svg' %}">
|
||||
</div>
|
||||
</a>
|
||||
<a href="{% url 'hosting:dashboard' %}" class="hosting-dashboard-item">
|
||||
<a href="{% url 'hosting:virtual_machines' %}" class="hosting-dashboard-item">
|
||||
<h2>{% trans "My VMs" %}</h2>
|
||||
<div class="hosting-dashboard-image">
|
||||
<img class="svg-img" src="{% static 'hosting/img/vm.svg' %}">
|
||||
</div>
|
||||
</a>
|
||||
<a href="{% url 'hosting:dashboard' %}" class="hosting-dashboard-item">
|
||||
<a href="{% url 'hosting:ssh_keys' %}" class="hosting-dashboard-item">
|
||||
<h2>{% trans "My SSH Keys" %}</h2>
|
||||
<div class="hosting-dashboard-image">
|
||||
<img class="svg-img" src="{% static 'hosting/img/key.svg' %}">
|
||||
</div>
|
||||
</a>
|
||||
<a href="{% url 'hosting:dashboard' %}" class="hosting-dashboard-item">
|
||||
<a href="{% url 'hosting:invoices' %}" class="hosting-dashboard-item">
|
||||
<h2>{% trans "My Bills" %}</h2>
|
||||
<div class="hosting-dashboard-image">
|
||||
<img class="svg-img" src="{% static 'hosting/img/billing.svg' %}">
|
||||
</div>
|
||||
</a>
|
||||
<a href="{% url 'hosting:dashboard' %}" class="hosting-dashboard-item">
|
||||
<a href="{% url 'hosting:settings' %}" class="hosting-dashboard-item">
|
||||
<h2>{% trans "My Settings" %}</h2>
|
||||
<div class="hosting-dashboard-image">
|
||||
<img class="svg-img" src="{% static 'hosting/img/dashboard_settings.svg' %}">
|
||||
|
|
|
@ -1,59 +0,0 @@
|
|||
{% load static i18n %}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>{% trans "Data Center Light Account Activation" %}</title>
|
||||
<link rel="shortcut icon" href="{{ base_url }}{% static 'hosting/img/favicon.ico' %}" type="image/x-icon">
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:300,400">
|
||||
</head>
|
||||
|
||||
<body style="margin: 0; padding: 20px 0;">
|
||||
<table style="width: 100%; border-spacing: 0; border-collapse: collapse; max-width: 560px;">
|
||||
<tr>
|
||||
<td>
|
||||
<img src="{{ base_url }}{% static 'hosting/img/datacenterlight.png' %}" style="max-width: 200px;">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 15px;">
|
||||
<h1 style="font-family: Lato, Arial, sans-serif; font-size: 25px; font-weight: 400; margin: 0;">{% trans "Data Center Light Account Activation" %}</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 25px; font-size: 16px;">
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 10px; margin-top: 0;">
|
||||
{% blocktrans %}You can activate your Data Center Light account by clicking <a href="{{base_url}}{{activation_link}}" style="text-decoration: none; color: #4382c8; font-weight: 400;">here</a>.{% endblocktrans %}
|
||||
</p>
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 10px; margin-top: 0;">
|
||||
{% blocktrans %}You can also copy and paste the following link into the address bar of your browser to activate your Data Center Light account.{% endblocktrans %}
|
||||
</p>
|
||||
<p style="color: #4382c8; line-height: 1.4; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;">
|
||||
{{base_url}}{{activation_link}}
|
||||
</p>
|
||||
{% if account_details %}
|
||||
{% url 'hosting:reset_password' as reset_password_url %}
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 10px; margin-top: 10px;">
|
||||
{% trans "Your account details are as follows" %}:
|
||||
</p>
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 10px; margin-top: 0;">
|
||||
{% trans "Username" %} : {% trans "Your email address" %}<br/>
|
||||
{% trans "Password" %} : {{account_details}}
|
||||
</p>
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 0; margin-top: 0;">
|
||||
{% blocktrans %}You can reset your password <a href="{{base_url}}{{reset_password_url}}" style="text-decoration: none; color: #4382c8; font-weight: 400;">here</a>.{% endblocktrans %}
|
||||
</p>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 40px; padding-bottom: 25px;">
|
||||
<h3 style="font-family: Lato, Arial, sans-serif; margin: 0; font-weight: 400; font-size: 15px;">{% trans "Your Data Center Light Team" %}</h3>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -1,20 +0,0 @@
|
|||
{% load i18n %}
|
||||
|
||||
{% trans "Data Center Light Account Activation" %}
|
||||
|
||||
{% blocktrans %}You can copy and paste the following link into the address bar of your browser to activate your Data Center Light account.{% endblocktrans %}
|
||||
|
||||
{{base_url}}{{activation_link}}
|
||||
|
||||
{% if account_details %}
|
||||
{% url 'hosting:reset_password' as reset_password_url %}
|
||||
{% trans "Your account details are as follows" %}:
|
||||
|
||||
{% trans "Username" %} : {% trans "Your email address" %}
|
||||
{% trans "Password" %} : {{account_details}}
|
||||
|
||||
{% trans "You can reset your password here" %}:
|
||||
{{base_url}}{{reset_password_url}}
|
||||
{% endif %}
|
||||
|
||||
{% trans "Your Data Center Light Team" %}
|
|
@ -1,4 +1,4 @@
|
|||
{% load static %}
|
||||
{% load static from static %}
|
||||
<!-- Inliner Build Version 4380b7741bb759d6cb997545f3add21ad48f010b -->
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
|
||||
|
|
|
@ -1,48 +0,0 @@
|
|||
{% load static i18n %}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>{% trans "Welcome to Data Center Light!" %}</title>
|
||||
<link rel="shortcut icon" href="{{ base_url }}{% static 'hosting/img/favicon.ico' %}" type="image/x-icon">
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:300,400">
|
||||
</head>
|
||||
|
||||
<body style="margin: 0; padding: 20px 0;">
|
||||
<table style="width: 100%; border-spacing: 0; border-collapse: collapse; max-width: 560px;">
|
||||
<tr>
|
||||
<td>
|
||||
<img src="{{ base_url }}{% static 'hosting/img/datacenterlight.png' %}" style="max-width: 200px;">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 15px;">
|
||||
<h1 style="font-family: Lato, Arial, sans-serif; font-size: 25px; font-weight: 400; margin: 0;">{% trans "Welcome to Data Center Light!" %}</h1>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 25px; font-size: 16px;">
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;">
|
||||
{% blocktrans %}Thanks for joining us! We provide the most affordable virtual machines from the heart of Switzerland.{% endblocktrans %}
|
||||
</p>
|
||||
<p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;">
|
||||
{% blocktrans %}Try now, order a VM. VM price starts from only 11.5 CHF per month.{% endblocktrans %}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 30px;">
|
||||
<a class="btn" href="{{ base_url }}{% url 'hosting:create_virtual_machine' %}" style="font-family: Lato, Arial, sans-serif; text-decoration: none; background-color: #1596da; color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 30px; padding-right: 30px; letter-spacing: 0.5px; border-radius: 3px; display: inline-block;">{% trans "ORDER VM" %}</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding-top: 40px; padding-bottom: 25px;">
|
||||
<h3 style="font-family: Lato, Arial, sans-serif; margin: 0; font-weight: 400; font-size: 15px;">{% trans "Your Data Center Light Team" %}</h3>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -1,10 +0,0 @@
|
|||
{% load i18n %}
|
||||
|
||||
{% trans "Welcome to Data Center Light!" %}
|
||||
|
||||
{% blocktrans %}Thanks for joining us! We provide the most affordable virtual machines from the heart of Switzerland.{% endblocktrans %}
|
||||
{% blocktrans %}Try now, order a VM. VM price starts from only 11.5 CHF per month.{% endblocktrans %}
|
||||
|
||||
{{ base_url }}{% url 'hosting:create_virtual_machine' %}
|
||||
|
||||
{% trans "Your Data Center Light Team" %}
|
|
@ -5,7 +5,7 @@
|
|||
<div class="topnav">
|
||||
<!-- Brand and toggle get grouped for better mobile display -->
|
||||
<div class="navbar-header">
|
||||
<a id="logoWhite" class="navbar-brand topnav" href="{% url 'hosting:login' %}"><img src="{% static 'hosting/img/logo_white.svg' %}"></a>
|
||||
<a id="logoWhite" class="navbar-brand topnav" href="{% url 'datacenterlight:index' %}"><img src="{% static 'datacenterlight/img/logo_white.svg' %}"></a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.container -->
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
{% endif %}
|
||||
<a class="navbar-brand topnav" href="{% url 'hosting:login' %}"><img src="{% static 'datacenterlight/img/logo_black.svg' %}"></a>
|
||||
<a class="navbar-brand topnav" href="{% url 'datacenterlight:index' %}"><img src="{% static 'datacenterlight/img/logo_black.svg' %}"></a>
|
||||
</div>
|
||||
{% if request.user.is_authenticated %}
|
||||
<!-- Collect the nav links, forms, and other content for toggling -->
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{% extends "hosting/base_short.html" %}
|
||||
{% load i18n static bootstrap3 %}
|
||||
{% load i18n static bootstrap3%}
|
||||
|
||||
{% block navbar %}
|
||||
{% include 'hosting/includes/_navbar_transparent.html' %}
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
|
||||
import logging
|
||||
|
||||
from django import template
|
||||
from django.urls import resolve, reverse
|
||||
from django.utils.translation import activate, get_language
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
@register.simple_tag(takes_context=True)
|
||||
def change_lang(context, lang=None, *args, **kwargs):
|
||||
|
||||
path = context['request'].path
|
||||
url_parts = resolve(path)
|
||||
|
||||
url = path
|
||||
cur_language = get_language()
|
||||
try:
|
||||
activate(lang)
|
||||
url = reverse(url_parts.view_name, kwargs=url_parts.kwargs)
|
||||
finally:
|
||||
activate(cur_language)
|
||||
|
||||
return "%s" % url
|
81
hosting/urls.py
Normal file → Executable file
81
hosting/urls.py
Normal file → Executable file
|
@ -1,40 +1,75 @@
|
|||
from django.urls import re_path
|
||||
from django.contrib.auth import views as auth_views
|
||||
|
||||
from .views import SSHKeyCreateView, AskSSHKeyView, PaymentOrderView, OrderConfirmationView
|
||||
from utils.views import SSHKeyCreateView, AskSSHKeyView
|
||||
from .views import (
|
||||
#PaymentVMView,
|
||||
DjangoHostingView, RailsHostingView, PaymentVMView, NodeJSHostingView,
|
||||
LoginView, SignupView, SignupValidateView, SignupValidatedView, IndexView,
|
||||
#OrdersHostingListView, OrdersHostingDetailView,
|
||||
#VirtualMachinesPlanListView, VirtualMachineView, OrdersHostingDeleteView,
|
||||
#MarkAsReadNotificationView,
|
||||
# NotificationsView, MarkAsReadNotificationView,
|
||||
OrdersHostingListView, OrdersHostingDetailView,
|
||||
VirtualMachinesPlanListView, VirtualMachineView, OrdersHostingDeleteView,
|
||||
PasswordResetView, PasswordResetConfirmView,
|
||||
#HostingPricingView, CreateVirtualMachinesView, HostingBillListView,
|
||||
#HostingBillDetailView, SSHKeyDeleteView, SSHKeyListView,
|
||||
#SSHKeyChoiceView, DashboardView, SettingsView,
|
||||
ResendActivationEmailView, DashboardView, CustomLogoutView
|
||||
#InvoiceListView, InvoiceDetailView, CheckUserVM
|
||||
HostingPricingView, CreateVirtualMachinesView, HostingBillListView,
|
||||
HostingBillDetailView, SSHKeyDeleteView, SSHKeyListView,
|
||||
SSHKeyChoiceView, DashboardView, SettingsView, ResendActivationEmailView,
|
||||
InvoiceListView, InvoiceDetailView, CustomLogoutView
|
||||
)
|
||||
|
||||
app_name = 'hosting'
|
||||
|
||||
urlpatterns = [
|
||||
#re_path(r'/', IndexView.as_view(), name='index'),
|
||||
re_path(r'index/?$', IndexView.as_view(), name='index'),
|
||||
re_path(r'django/?$', DjangoHostingView.as_view(), name='djangohosting'),
|
||||
# re_path(r'checkvm/?$', CheckUserVM.as_view(), name='check_vm'),
|
||||
re_path(r'dashboard/?$', DashboardView.as_view(), name='dashboard'),
|
||||
re_path(r'nodejs/?$', NodeJSHostingView.as_view(), name='nodejshosting'),
|
||||
re_path(r'rails/?$', RailsHostingView.as_view(), name='railshosting'),
|
||||
re_path(r'pricing/?$', HostingPricingView.as_view(), name='pricing'),
|
||||
re_path(r'payment/?$', PaymentVMView.as_view(), name='payment'),
|
||||
re_path(r'settings/?$', SettingsView.as_view(), name='settings'),
|
||||
re_path(r'orders/?$', OrdersHostingListView.as_view(), name='orders'),
|
||||
re_path(r'invoices/?$', InvoiceListView.as_view(), name='invoices'),
|
||||
re_path(r'order-confirmation/?$', OrdersHostingDetailView.as_view(),
|
||||
name='order-confirmation'),
|
||||
re_path(r'^add-ssh-key/?$', AskSSHKeyView.as_view(),
|
||||
name='add_ssh_key'),
|
||||
re_path(r'orders/(?P<pk>\d+)/?$', OrdersHostingDetailView.as_view(),
|
||||
name='orders'),
|
||||
re_path(r'invoice/(?P<invoice_id>[-\w]+)/?$', InvoiceDetailView.as_view(),
|
||||
name='invoices'),
|
||||
re_path(r'bills/?$', HostingBillListView.as_view(), name='bills'),
|
||||
re_path(r'bills/(?P<pk>\d+)/?$', HostingBillDetailView.as_view(),
|
||||
name='bills'),
|
||||
re_path(r'cancel_order/(?P<pk>\d+)/?$',
|
||||
OrdersHostingDeleteView.as_view(), name='delete_order'),
|
||||
re_path(r'create_virtual_machine/?$', CreateVirtualMachinesView.as_view(),
|
||||
name='create_virtual_machine'),
|
||||
re_path(r'my-virtual-machines/?$',
|
||||
VirtualMachinesPlanListView.as_view(), name='virtual_machines'),
|
||||
re_path(r'my-virtual-machines/(?P<pk>\d+)/?$', VirtualMachineView.as_view(),
|
||||
name='virtual_machines'),
|
||||
re_path(r'ssh_keys/?$', SSHKeyListView.as_view(),
|
||||
name='ssh_keys'),
|
||||
re_path(r'ssh_keys_choice/?$', SSHKeyChoiceView.as_view(),
|
||||
name='choice_ssh_keys'),
|
||||
re_path(r'delete_ssh_key/(?P<pk>\d+)/?$', SSHKeyDeleteView.as_view(),
|
||||
name='delete_ssh_key'),
|
||||
re_path(r'delete_card/(?P<pk>[\w\-]+)/$', SettingsView.as_view(),
|
||||
name='delete_card'),
|
||||
re_path(r'create_ssh_key/?$', SSHKeyCreateView.as_view(),
|
||||
name='create_ssh_key'),
|
||||
# re_path(r'^notifications/$', NotificationsView.as_view(),
|
||||
# name='notifications'),
|
||||
# re_path(r'^notifications/(?P<pk>\d+)/?$', MarkAsReadNotificationView.as_view(),
|
||||
# name='read_notification'),
|
||||
re_path(r'login/?$', LoginView.as_view(), name='login'),
|
||||
re_path(r'signup/?$', SignupView.as_view(), name='signup'),
|
||||
re_path(r'signup-validate/?$', SignupValidateView.as_view(),
|
||||
name='signup-validate'),
|
||||
name='signup-validate'),
|
||||
re_path(r'resend-activation-link/?$', ResendActivationEmailView.as_view(),
|
||||
name='resend_activation_link'),
|
||||
name='resend_activation_link'),
|
||||
re_path(r'reset-password/?$', PasswordResetView.as_view(),
|
||||
name='reset_password'),
|
||||
name='reset_password'),
|
||||
re_path(r'reset-password-confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',
|
||||
PasswordResetConfirmView.as_view(), name='reset_password_confirm'),
|
||||
re_path('^logout/', CustomLogoutView.as_view(), name='logout'),
|
||||
re_path(r'^logout/?$', CustomLogoutView.as_view(), name='logout'),
|
||||
re_path(r'^validate/(?P<validate_slug>.*)/$',
|
||||
SignupValidatedView.as_view(), name='validate'),
|
||||
re_path(r'dashboard/?$', DashboardView.as_view(), name='dashboard'),
|
||||
re_path(r'^payment/?$', PaymentOrderView.as_view(), name='payment'),
|
||||
re_path(r'^order-confirmation/?$', OrderConfirmationView.as_view(),
|
||||
name='order_confirmation'),
|
||||
SignupValidatedView.as_view(), name='validate')
|
||||
]
|
303
hosting/utils.py
303
hosting/utils.py
|
@ -1,303 +0,0 @@
|
|||
import datetime
|
||||
import decimal
|
||||
import json
|
||||
|
||||
import stripe
|
||||
from django.http import JsonResponse
|
||||
|
||||
from dynamicweb2.stripe_utils import StripeUtils
|
||||
from hosting.models import VATRates, UserBillingAddress, BillingAddress, StripeCustomer, UserHostingKey, VMPricing
|
||||
from django.conf import settings
|
||||
from django.contrib import messages
|
||||
from django.utils.translation import get_language, gettext_lazy as _
|
||||
from django.urls import reverse
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
eu_countries = ['at', 'be', 'bg', 'ch', 'cy', 'cz', 'hr', 'dk',
|
||||
'ee', 'fi', 'fr', 'mc', 'de', 'gr', 'hu', 'ie', 'it',
|
||||
'lv', 'lu', 'mt', 'nl', 'pl', 'pt', 'ro', 'sk', 'si', 'es',
|
||||
'se', 'gb']
|
||||
|
||||
|
||||
def get_vat_rate_for_country(country):
|
||||
try:
|
||||
vat_rate = VATRates.objects.get(
|
||||
territory_codes=country, start_date__isnull=False, stop_date=None
|
||||
)
|
||||
logger.debug("VAT rate for %s is %s" % (country, vat_rate.rate))
|
||||
return vat_rate.rate
|
||||
except VATRates.DoesNotExist as dne:
|
||||
logger.debug(str(dne))
|
||||
logger.debug("Did not find VAT rate for %s, returning 0" % country)
|
||||
return 0
|
||||
|
||||
|
||||
def validate_vat_number(stripe_customer_id, billing_address_id,
|
||||
is_user_ba=False):
|
||||
if is_user_ba:
|
||||
billing_address = get_billing_address(billing_address_id)
|
||||
else:
|
||||
try:
|
||||
billing_address = BillingAddress.objects.get(id=billing_address_id)
|
||||
except BillingAddress.DoesNotExist:
|
||||
billing_address = None
|
||||
logger.debug("BillingAddress does not exist for %s" % billing_address_id)
|
||||
except BillingAddress.MultipleObjectsReturned:
|
||||
logger.debug("Multiple BillingAddress exist for %s" % billing_address_id)
|
||||
billing_address = BillingAddress.objects.filter(id=billing_address_id).order_by('-id').first()
|
||||
if billing_address is not None:
|
||||
logger.debug("BillingAddress found: %s %s type=%s" % (
|
||||
billing_address_id, str(billing_address), type(billing_address)))
|
||||
if billing_address.country.lower().strip() not in eu_countries:
|
||||
return {
|
||||
"validated_on": "",
|
||||
"status": "not_needed"
|
||||
}
|
||||
if billing_address.vat_number_validated_on:
|
||||
logger.debug("billing_address verified on %s" %
|
||||
billing_address.vat_number_validated_on)
|
||||
return {
|
||||
"validated_on": billing_address.vat_number_validated_on,
|
||||
"status": "verified"
|
||||
}
|
||||
else:
|
||||
logger.debug("billing_address not yet verified, "
|
||||
"Checking if we already have a tax id")
|
||||
if billing_address.stripe_tax_id:
|
||||
logger.debug("We have a tax id %s" % billing_address.stripe_tax_id)
|
||||
tax_id_obj = stripe.Customer.retrieve_tax_id(
|
||||
stripe_customer_id,
|
||||
billing_address.stripe_tax_id,
|
||||
)
|
||||
if tax_id_obj.verification.status == "verified":
|
||||
logger.debug("Latest status on Stripe=%s. Updating" %
|
||||
tax_id_obj.verification.status)
|
||||
# update billing address
|
||||
billing_address.vat_number_validated_on = datetime.datetime.now()
|
||||
billing_address.vat_validation_status = tax_id_obj.verification.status
|
||||
billing_address.save()
|
||||
return {
|
||||
"status": "verified",
|
||||
"validated_on": billing_address.vat_number_validated_on
|
||||
}
|
||||
else:
|
||||
billing_address.vat_validation_status = tax_id_obj.verification.status
|
||||
billing_address.save()
|
||||
logger.debug(
|
||||
"Latest status on Stripe=%s" % str(tax_id_obj)
|
||||
)
|
||||
return {
|
||||
"status": tax_id_obj.verification.status if tax_id_obj
|
||||
else "unknown",
|
||||
"validated_on": ""
|
||||
}
|
||||
else:
|
||||
logger.debug("Creating a tax id")
|
||||
logger.debug("Billing address = %s" % str(billing_address))
|
||||
tax_id_obj = create_tax_id(
|
||||
stripe_customer_id, billing_address_id,
|
||||
"ch_vat" if billing_address.country.lower() == "ch" else "eu_vat",
|
||||
is_user_ba=is_user_ba
|
||||
)
|
||||
logger.debug("tax_id_obj = %s" % str(tax_id_obj))
|
||||
else:
|
||||
logger.debug("invalid billing address")
|
||||
return {
|
||||
"status": "invalid billing address",
|
||||
"validated_on": ""
|
||||
}
|
||||
|
||||
if 'response_object' in tax_id_obj:
|
||||
return tax_id_obj
|
||||
|
||||
return {
|
||||
"status": tax_id_obj.verification.status,
|
||||
"validated_on": datetime.datetime.now() if tax_id_obj.verification.status == "verified" else ""
|
||||
}
|
||||
|
||||
|
||||
def get_billing_address(billing_address_id):
|
||||
try:
|
||||
billing_address = UserBillingAddress.objects.get(
|
||||
id=billing_address_id)
|
||||
except UserBillingAddress.DoesNotExist:
|
||||
billing_address = None
|
||||
logger.debug(
|
||||
"UserBillingAddress does not exist for %s" % billing_address_id)
|
||||
except UserBillingAddress.MultipleObjectsReturned:
|
||||
logger.debug(
|
||||
"Multiple UserBillingAddress exist for %s" % billing_address_id)
|
||||
billing_address = UserBillingAddress.objects.filter(
|
||||
id=billing_address_id).order_by('-id').first()
|
||||
return billing_address
|
||||
|
||||
|
||||
def create_tax_id(stripe_customer_id, billing_address_id, vat_type, is_user_ba=False):
|
||||
if is_user_ba:
|
||||
billing_address = get_billing_address(billing_address_id)
|
||||
else:
|
||||
try:
|
||||
billing_address = BillingAddress.objects.get(id=billing_address_id)
|
||||
except BillingAddress.DoesNotExist:
|
||||
billing_address = None
|
||||
logger.debug("BillingAddress does not exist for %s" % billing_address_id)
|
||||
except BillingAddress.MultipleObjectsReturned:
|
||||
logger.debug("Multiple BillingAddress exist for %s" % billing_address_id)
|
||||
billing_address = BillingAddress.objects.filter(billing_address_id).order_by('-id').first()
|
||||
|
||||
tax_id_obj = None
|
||||
tax_id_response = None
|
||||
if billing_address:
|
||||
stripe_utils = StripeUtils()
|
||||
tax_id_response = stripe_utils.get_or_create_tax_id_for_user(
|
||||
stripe_customer_id,
|
||||
vat_number=billing_address.vat_number,
|
||||
vat_type=vat_type,
|
||||
country=billing_address.country
|
||||
)
|
||||
|
||||
tax_id_obj = tax_id_response.get('response_object')
|
||||
|
||||
if not tax_id_obj:
|
||||
logger.debug("Received none in tax_id_obj")
|
||||
return {
|
||||
'paid': False,
|
||||
'response_object': None,
|
||||
'error': tax_id_response["error"] if tax_id_response and 'error' in tax_id_response else
|
||||
"No such address found"
|
||||
}
|
||||
|
||||
try:
|
||||
stripe_customer = StripeCustomer.objects.get(stripe_id=stripe_customer_id)
|
||||
billing_address_set = set()
|
||||
logger.debug("Updating billing address")
|
||||
for ho in stripe_customer.hostingorder_set.all():
|
||||
if ho.billing_address.vat_number == billing_address.vat_number:
|
||||
billing_address_set.add(ho.billing_address)
|
||||
for b_address in billing_address_set:
|
||||
b_address.stripe_tax_id = tax_id_obj.id
|
||||
b_address.vat_validation_status = tax_id_obj.verification.status
|
||||
b_address.save()
|
||||
logger.debug("Updated billing_address %s" % str(b_address))
|
||||
|
||||
ub_addresses = stripe_customer.user.billing_addresses.filter(
|
||||
vat_number=billing_address.vat_number)
|
||||
for ub_address in ub_addresses:
|
||||
ub_address.stripe_tax_id = tax_id_obj.id
|
||||
ub_address.vat_validation_status = tax_id_obj.verification.status
|
||||
ub_address.save()
|
||||
logger.debug("Updated user_billing_address %s" % str(ub_address))
|
||||
except StripeCustomer.DoesNotExist:
|
||||
logger.debug("StripeCustomer %s does not exist" % stripe_customer_id)
|
||||
billing_address.stripe_tax_id = tax_id_obj.id
|
||||
billing_address.vat_validation_status = tax_id_obj.verification.status
|
||||
billing_address.save()
|
||||
return tax_id_obj
|
||||
|
||||
|
||||
def get_vm_price_for_given_vat(cpu, memory, ssd_size, hdd_size=0,
|
||||
pricing_name='default', vat_rate=0):
|
||||
try:
|
||||
pricing = VMPricing.objects.get(name=pricing_name)
|
||||
except Exception as ex:
|
||||
logger.error(
|
||||
"Error getting VMPricing object for {pricing_name}."
|
||||
"Details: {details}".format(
|
||||
pricing_name=pricing_name, details=str(ex)
|
||||
)
|
||||
)
|
||||
return None
|
||||
|
||||
price = (
|
||||
(decimal.Decimal(cpu) * pricing.cores_unit_price) +
|
||||
(decimal.Decimal(memory) * pricing.ram_unit_price) +
|
||||
(decimal.Decimal(ssd_size) * pricing.ssd_unit_price) +
|
||||
(decimal.Decimal(hdd_size) * pricing.hdd_unit_price) +
|
||||
decimal.Decimal(settings.VM_BASE_PRICE)
|
||||
)
|
||||
|
||||
discount_name = pricing.discount_name
|
||||
discount_amount = round(float(pricing.discount_amount), 2)
|
||||
vat = price * decimal.Decimal(vat_rate) * decimal.Decimal(0.01)
|
||||
vat_percent = vat_rate
|
||||
|
||||
cents = decimal.Decimal('.01')
|
||||
price = price.quantize(cents, decimal.ROUND_HALF_UP)
|
||||
vat = vat.quantize(cents, decimal.ROUND_HALF_UP)
|
||||
discount_amount_with_vat = (decimal.Decimal(discount_amount) *
|
||||
(1 + decimal.Decimal(vat_rate) * decimal.Decimal(0.01)))
|
||||
discount_amount_with_vat = discount_amount_with_vat.quantize(cents, decimal.ROUND_HALF_UP)
|
||||
discount = {
|
||||
'name': discount_name,
|
||||
'amount': discount_amount,
|
||||
'amount_with_vat': round(float(discount_amount_with_vat), 2),
|
||||
'stripe_coupon_id': pricing.stripe_coupon_id
|
||||
}
|
||||
return (round(float(price), 2), round(float(vat), 2),
|
||||
round(float(vat_percent), 2), discount)
|
||||
|
||||
|
||||
def get_all_public_keys(customer):
|
||||
"""
|
||||
Returns all the public keys of the user
|
||||
:param customer: The customer whose public keys are needed
|
||||
:return: A list of public keys
|
||||
"""
|
||||
return UserHostingKey.objects.filter(user_id=customer.id).values_list(
|
||||
"public_key", flat=True).distinct()
|
||||
|
||||
|
||||
def create_incomplete_intent_request(request):
|
||||
"""
|
||||
Creates a dictionary of all session variables so that they could be
|
||||
picked up in the webhook for processing.
|
||||
|
||||
:param request:
|
||||
:return:
|
||||
"""
|
||||
req = {
|
||||
'scheme': request.scheme,
|
||||
'host': request.get_host(),
|
||||
'language': get_language(),
|
||||
'new_user_hosting_key_id': request.session.get(
|
||||
'new_user_hosting_key_id', None),
|
||||
'card_id': request.session.get('card_id', None),
|
||||
'generic_payment_type': request.session.get(
|
||||
'generic_payment_type', None),
|
||||
'generic_payment_details': request.session.get(
|
||||
'generic_payment_details', None),
|
||||
'user': request.session.get('user', None),
|
||||
'id_payment_method': request.session.get('id_payment_method', None),
|
||||
}
|
||||
return json.dumps(req)
|
||||
|
||||
|
||||
def get_error_response_dict(msg, request):
|
||||
logger.error(msg)
|
||||
response = {
|
||||
'status': False,
|
||||
'redirect': "{url}#{section}".format(
|
||||
url=(reverse(
|
||||
'show_product',
|
||||
kwargs={'product_slug': request.session['generic_payment_details']['product_slug']}
|
||||
) if 'generic_payment_details' in request.session else
|
||||
reverse('hosting:payment')
|
||||
),
|
||||
section='payment_error'
|
||||
),
|
||||
'msg_title': str(_('Error.')),
|
||||
'msg_body': str(
|
||||
_('There was a payment related error.'
|
||||
' On close of this popup, you will be redirected back to'
|
||||
' the payment page.'))
|
||||
}
|
||||
return response
|
||||
|
||||
|
||||
def show_error(msg, request):
|
||||
logger.error(msg)
|
||||
messages.add_message(request, messages.ERROR, msg, extra_tags='failed_payment')
|
||||
return JsonResponse(get_error_response_dict(msg,request))
|
2710
hosting/views.py
Normal file → Executable file
2710
hosting/views.py
Normal file → Executable file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue