diff --git a/controllers/inv.py b/controllers/inv.py
index 3721db8d8d..e43c2ca823 100644
--- a/controllers/inv.py
+++ b/controllers/inv.py
@@ -1378,7 +1378,7 @@ def track_item():
#"send_id",
#"req_item_id",
(T("Date Released"), "send_id$date"),
- (T("Beneficiary"), "send_id$site_id"),
+ (T("Beneficiary"), "send_id$to_site_id"),
(settings.get_inv_send_shortname(), "send_id$send_ref"),
(settings.get_req_shortname(), "send_id$req_ref"),
(T("Items/Description"), "item_id"),
@@ -1460,6 +1460,33 @@ def track_item():
]
)
s3.filter = (FS("expiry_date") != None)
+ elif report == "dist":
+ # Summary of Releases
+ s3.crud_strings["inv_track_item"] = Storage(title_list = T("Distribution Report"))
+
+ level_fields = ["send_id$to_site_id$location_id$%s" % level for
+ level in current.gis.get_relevant_hierarchy_levels()]
+
+ s3db.configure("inv_track_item",
+ list_fields = ["id",
+ #"send_id",
+ #"req_item_id",
+ (T("Date Sent"), "send_id$date"),
+ (s3db.inv_send.to_site_id.label, "send_id$to_site_id")] +
+ level_fields +
+ [(settings.get_inv_send_shortname(), "send_id$send_ref"),
+ (settings.get_req_shortname(), "send_id$req_ref"),
+ (T("Items"), "item_id"),
+ (T("Source"), "supply_org_id"),
+ (T("Unit"), "item_pack_id"),
+ (T("Quantity"), "quantity"),
+ (T("Unit Cost"), "pack_value"),
+ (T("Total Cost"), "total_value"),
+ ],
+ orderby = "inv_send.date dsc",
+ sort = True
+ )
+ s3.filter = (FS("send_id$type") == 21)
output = s3_rest_controller(rheader = s3db.inv_rheader)
return output
diff --git a/modules/s3/s3gis.py b/modules/s3/s3gis.py
index 8e4ab20bca..def036cd98 100644
--- a/modules/s3/s3gis.py
+++ b/modules/s3/s3gis.py
@@ -1527,6 +1527,7 @@ def get_location_hierarchy(self, level=None, location=None):
db = current.db
s3db = current.s3db
table = s3db.gis_hierarchy
+ ltable = s3db.gis_location
fields = (table.uuid,
table.L1,
@@ -1536,7 +1537,15 @@ def get_location_hierarchy(self, level=None, location=None):
table.L5,
)
- query = (table.uuid == "SITE_DEFAULT")
+ countries = current.deployment_settings.get_gis_countries()
+ if len(countries) == 1:
+ #If the site is only configed for one country, use the hierarchy for that country
+ query = (table.location_id == ltable.id) & \
+ (ltable.level == "L0") & \
+ (ltable.name == self.get_country(countries[0],key_type="code"))
+ else:
+ query = (table.uuid == "SITE_DEFAULT")
+
if not location:
config = GIS.get_config()
location = config.region_location_id
diff --git a/modules/s3/s3query.py b/modules/s3/s3query.py
index b2cdc7fd9f..333529f1be 100644
--- a/modules/s3/s3query.py
+++ b/modules/s3/s3query.py
@@ -676,7 +676,7 @@ def __init__(self, resource, selector, label=None):
# Fall back to the field label
if label is None:
fname = self.fname
- if fname in ["L1", "L2", "L3", "L3", "L4", "L5"]:
+ if fname in ("L1", "L2", "L3", "L3", "L4", "L5"):
try:
label = current.gis.get_location_hierarchy(fname)
except:
diff --git a/modules/s3/s3widgets.py b/modules/s3/s3widgets.py
index d7ffbe5667..ca5665cf4c 100644
--- a/modules/s3/s3widgets.py
+++ b/modules/s3/s3widgets.py
@@ -7925,75 +7925,74 @@ class ICON(I):
"zoomin": "icon-zoomin",
"zoomout": "icon-zoomout",
},
- # @todo: integrate
- #"font-awesome4": {
- #"_base": "fa",
- #"active": "fa-check",
- #"activity": "fa-tag",
- #"add": "fa-plus",
- #"arrow-down": "fa-arrow-down",
- #"attachment": "fa-paper-clip",
- #"bar-chart": "fa-bar-chart",
- #"book": "fa-book",
- #"bookmark": "fa-bookmark",
- #"bookmark-empty": "fa-bookmark-empty",
- #"briefcase": "fa-briefcase",
- #"calendar": "fa-calendar",
- #"certificate": "fa-certificate",
- #"comment-alt": "fa-comment-o",
- #"commit": "fa-truck",
- #"delete": "fa-trash",
- #"deploy": "fa-plus",
- #"deployed": "fa-check",
- #"down": "fa-caret-down",
- #"edit": "fa-edit",
- #"exclamation": "fa-exclamation",
- #"facebook": "fa-facebook",
- #"facility": "fa-home",
- #"file": "fa-file",
- #"file-alt": "fa-file-alt",
- #"folder-open-alt": "fa-folder-open-o",
- #"fullscreen": "fa-fullscreen",
- #"globe": "fa-globe",
- #"group": "fa-group",
- #"home": "fa-home",
- #"inactive": "fa-check-empty",
- #"link": "fa-external-link",
- #"list": "fa-list",
- #"location": "fa-globe",
- #"mail": "fa-envelope-o",
- #"map-marker": "fa-map-marker",
- #"offer": "fa-truck",
- #"organisation": "fa-institution",
- #"org-network": "fa-umbrella",
- #"other": "fa-circle",
- #"paper-clip": "fa-paper-clip",
- #"phone": "fa-phone",
- #"plus": "fa-plus",
- #"plus-sign": "fa-plus-sign",
- #"radio": "fa-microphone",
- #"remove": "fa-remove",
- #"request": "fa-flag",
- #"responsibility": "fa-briefcase",
- #"rss": "fa-rss",
- #"sent": "fa-check",
- #"site": "fa-home",
- #"skype": "fa-skype",
- #"star": "fa-star",
- #"table": "fa-table",
- #"tag": "fa-tag",
- #"tags": "fa-tags",
- #"tasks": "fa-tasks",
- #"time": "fa-time",
- #"truck": "fa-truck",
- #"twitter": "fa-twitter",
- #"unsent": "fa-times",
- #"up": "fa-caret-up",
- #"upload": "fa-upload",
- #"user": "fa-user",
- #"zoomin": "fa-zoomin",
- #"zoomout": "fa-zoomout",
- #},
+ "font-awesome4": {
+ "_base": "fa",
+ "active": "fa-check",
+ "activity": "fa-tag",
+ "add": "fa-plus",
+ "arrow-down": "fa-arrow-down",
+ "attachment": "fa-paper-clip",
+ "bar-chart": "fa-bar-chart",
+ "book": "fa-book",
+ "bookmark": "fa-bookmark",
+ "bookmark-empty": "fa-bookmark-empty",
+ "briefcase": "fa-briefcase",
+ "calendar": "fa-calendar",
+ "certificate": "fa-certificate",
+ "comment-alt": "fa-comment-o",
+ "commit": "fa-truck",
+ "delete": "fa-trash",
+ "deploy": "fa-plus",
+ "deployed": "fa-check",
+ "down": "fa-caret-down",
+ "edit": "fa-edit",
+ "exclamation": "fa-exclamation",
+ "facebook": "fa-facebook",
+ "facility": "fa-home",
+ "file": "fa-file",
+ "file-alt": "fa-file-alt",
+ "folder-open-alt": "fa-folder-open-o",
+ "fullscreen": "fa-fullscreen",
+ "globe": "fa-globe",
+ "group": "fa-group",
+ "home": "fa-home",
+ "inactive": "fa-check-empty",
+ "link": "fa-external-link",
+ "list": "fa-list",
+ "location": "fa-globe",
+ "mail": "fa-envelope-o",
+ "map-marker": "fa-map-marker",
+ "offer": "fa-truck",
+ "organisation": "fa-sitemap",
+ "org-network": "fa-umbrella",
+ "other": "fa-circle",
+ "paper-clip": "fa-paper-clip",
+ "phone": "fa-phone",
+ "plus": "fa-plus",
+ "plus-sign": "fa-plus-sign",
+ "radio": "fa-microphone",
+ "remove": "fa-remove",
+ "request": "fa-flag",
+ "responsibility": "fa-briefcase",
+ "rss": "fa-rss",
+ "sent": "fa-check",
+ "site": "fa-home",
+ "skype": "fa-skype",
+ "star": "fa-star",
+ "table": "fa-table",
+ "tag": "fa-tag",
+ "tags": "fa-tags",
+ "tasks": "fa-tasks",
+ "time": "fa-time",
+ "truck": "fa-truck",
+ "twitter": "fa-twitter",
+ "unsent": "fa-times",
+ "up": "fa-caret-up",
+ "upload": "fa-upload",
+ "warehouse":"fa-th",
+ "zoomin": "fa-zoomin",
+ "zoomout": "fa-zoomout",
+ },
"foundation": {
"active": "fi-check",
"activity": "fi-price-tag",
diff --git a/modules/s3cfg.py b/modules/s3cfg.py
index f888dbfa95..906412d765 100644
--- a/modules/s3cfg.py
+++ b/modules/s3cfg.py
@@ -3511,6 +3511,11 @@ def get_req_restrict_on_complete(self):
# -------------------------------------------------------------------------
# Supply
#
+ def get_supply_autocomplete(self):
+ """
+ Whether supply fields should use an Autocomplete instead of a dropdown
+ """
+ return self.supply.get("autocomplete", False)
def get_supply_catalog_default(self):
return self.inv.get("catalog_default", "Default")
diff --git a/modules/s3db/hrm.py b/modules/s3db/hrm.py
index dfeade2c29..91329a74b9 100644
--- a/modules/s3db/hrm.py
+++ b/modules/s3db/hrm.py
@@ -5174,7 +5174,7 @@ def hrm_human_resource_onaccept(form):
ltable.insert(human_resource_id=id,
job_title_id=job_title_id,
main=True,
- start_date=request.utcnow,
+ date=request.utcnow,
)
data = Storage()
diff --git a/modules/s3db/inv.py b/modules/s3db/inv.py
index 1c346bc0dd..c61ca523b2 100644
--- a/modules/s3db/inv.py
+++ b/modules/s3db/inv.py
@@ -1050,6 +1050,8 @@ def model(self):
#send_type_opts.update(self.inv_item_status_opts)
send_type_opts.update(settings.get_inv_send_types())
+ ADD_FACILITY = T("Create Facility")
+
site_types = auth.org_site_types
tablename = "inv_send"
define_table(tablename,
@@ -1094,6 +1096,10 @@ def model(self):
not_filterby = "obsolete",
not_filter_opts = (True,),
)),
+ comment = S3AddResourceLink(c="org",
+ f="facility",
+ label=ADD_FACILITY,
+ title=ADD_FACILITY)
),
organisation_id(
label = T("To Organization"),
@@ -1183,6 +1189,8 @@ def model(self):
s3_comments(),
*s3_meta_fields())
+ levels = current.gis.get_relevant_hierarchy_levels()
+
# Filter Widgets
filter_widgets = [
S3TextFilter(["sender_id$first_name",
@@ -1194,7 +1202,7 @@ def model(self):
"recipient_id$first_name",
"recipient_id$middle_name",
"recipient_id$last_name",
- ],
+ ] + ["to_site_id$location_id$%s" % level for level in levels],
label = T("Search"),
comment = T("Search for an item by text."),
),
@@ -1204,6 +1212,9 @@ def model(self):
cols = 2,
hidden = True,
),
+ S3LocationFilter("to_site_id$location_id",
+ levels=levels,
+ ),
S3TextFilter("type",
label = T("Shipment Type"),
hidden = True,
@@ -1875,6 +1886,12 @@ def model(self):
label = T("Search"),
#comment = recv_search_comment,
),
+ S3OptionsFilter("send_id$site_id"),
+ S3LocationFilter("send_id$to_site_id$location_id",
+ #hidden=True,
+ label=T("Sent to Location"),
+ levels=levels,
+ ),
S3DateFilter("send_id$date",
label = T("Sent date"),
hidden = True,
@@ -2142,7 +2159,8 @@ def inv_send_controller(cls):
s3 = response.s3
# Limit site_id to sites the user has permissions for
- error_msg = T("You do not have permission for any facility to send a shipment.")
+ error_msg = T("You do not have permission for any %s to send a shipment.") % \
+ current.deployment_settings.get_inv_facility_label()
current.auth.permitted_facilities(table=sendtable, error_msg=error_msg)
# Set Validator for checking against the number of items in the warehouse
@@ -2534,7 +2552,7 @@ def inv_send_process():
site_id = send_record.to_site_id,
comments = send_record.comments,
status = SHIP_STATUS_SENT,
- type = 1, # 1:"Another Inventory"
+ type = 11, # 11:"Another Inventory"
)
# Change the status for all track items in this shipment to In transit
diff --git a/modules/s3db/org.py b/modules/s3db/org.py
index d6766bbc1a..6e72c06b94 100644
--- a/modules/s3db/org.py
+++ b/modules/s3db/org.py
@@ -323,7 +323,7 @@ def model(self):
label = T("Name"),
),
# http://hxl.humanitarianresponse.info/#abbreviation
- Field("acronym", length=16,
+ Field("acronym", length=20,
label = T("Acronym"),
represent = lambda val: val or "",
comment = DIV(_class="tooltip",
@@ -2119,11 +2119,11 @@ def model(self):
crud_strings[tablename] = Storage(
label_create = T("Create Resource"),
title_display = T("Resource Details"),
- title_list = T("Resource Inventory"),
+ title_list = T("Resources"),
title_update = T("Edit Resource"),
title_map = T("Map of Resources"),
title_upload = T("Import Resources"),
- label_list_button = T("Resource Inventory"),
+ label_list_button = T("Resources"),
label_delete_button = T("Delete Resource"),
msg_record_created = T("Resource added"),
msg_record_modified = T("Resource updated"),
diff --git a/modules/s3db/supply.py b/modules/s3db/supply.py
index 7a64310f0e..d6cfe624bf 100644
--- a/modules/s3db/supply.py
+++ b/modules/s3db/supply.py
@@ -425,6 +425,10 @@ def model(self):
supply_item_represent = supply_ItemRepresent(show_link=True)
# Reusable Field
+ if settings.get_supply_autocomplete():
+ default_widget = S3AutocompleteWidget("supply", "item")
+ else:
+ default_widget = None
supply_item_id = S3ReusableField("item_id",
"reference %s" % tablename, # 'item_id' for backwards-compatibility
label = T("Item"),
@@ -434,7 +438,7 @@ def model(self):
supply_item_represent,
sort=True),
sortby = "name",
- widget = S3AutocompleteWidget("supply", "item"),
+ widget = default_widget,
comment=S3AddResourceLink(c="supply",
f="item",
label=ADD_ITEM,
diff --git a/modules/s3db/vol.py b/modules/s3db/vol.py
index 22b133aea1..3628cdfa4e 100644
--- a/modules/s3db/vol.py
+++ b/modules/s3db/vol.py
@@ -742,6 +742,8 @@ def prep(r):
list_fields.append((T("Trainings"),"person_id$training.course_id"))
if settings.get_hrm_use_certificates():
list_fields.append((T("Certificates"),"person_id$certification.certificate_id"))
+ if r.representation == "xls":
+ list_fields.append("person_id$comments")
# Volunteer Programme and Active-status
report_options = get_config("report_options")
@@ -1148,7 +1150,7 @@ def prep(r):
resource = r.resource
if mode is not None:
- r.resource.build_query(id=s3_logged_in_person())
+ r.resource.build_query(id=current.auth.s3_logged_in_person())
elif r.method not in ("deduplicate", "search_ac"):
if not r.id and not hr_id:
# pre-action redirect => must retain prior errors
diff --git a/modules/s3layouts.py b/modules/s3layouts.py
index 38167fb216..2f5c6870b3 100644
--- a/modules/s3layouts.py
+++ b/modules/s3layouts.py
@@ -254,8 +254,7 @@ def layout(item):
_class = "active"
section = [LI(A(item.label,
- **attr
- ),
+ **attr),
_class="heading %s" % _class,
),
]
@@ -273,8 +272,7 @@ def layout(item):
_class = ""
return LI(A(item.label,
- **attr
- ),
+ **attr),
_class=_class,
)
else:
diff --git a/modules/s3menus.py b/modules/s3menus.py
index 00e773a066..a5ffd98302 100644
--- a/modules/s3menus.py
+++ b/modules/s3menus.py
@@ -1196,6 +1196,8 @@ def inv():
vars=dict(report="inc")),
M("Summary of Releases", c="inv", f="track_item",
vars=dict(report="rel")),
+ M("Distribution Report", c="inv", f="track_item",
+ vars=dict(report="dist")),
),
M(inv_recv_list, c="inv", f="recv", translate=False)( # Already T()
M("Create", m="create"),
@@ -1468,13 +1470,9 @@ def org():
M("Create", m="create"),
M("Import", m="import"),
),
- M("Resource Inventory", f="resource")(
+ M("Resources", f="resource")(
M("Create", m="create"),
- M("Import", m="import")
- ),
- M("Resources", f="resource", m="summary")(
- M("Create", m="create"),
- M("Import", m="import")
+ M("Import", m="import"),
),
M("Organization Types", f="organisation_type",
restrict=[ADMIN])(
diff --git a/modules/templates/IFRC/config.py b/modules/templates/IFRC/config.py
index e9240d2c9e..dbc4088f65 100644
--- a/modules/templates/IFRC/config.py
+++ b/modules/templates/IFRC/config.py
@@ -540,6 +540,7 @@ def currency_default(default):
# 36: T("Consignment"), # Borrowed
# 37: T("In Transit"), # Loaning warehouse space to another agency
# }
+ settings.supply.autocomplete = True
# -----------------------------------------------------------------------------
# Request Management
diff --git a/modules/templates/Nepal/config.py b/modules/templates/Nepal/config.py
index d5754b9175..7484d69bcd 100644
--- a/modules/templates/Nepal/config.py
+++ b/modules/templates/Nepal/config.py
@@ -8,7 +8,10 @@
from gluon.contrib.simplejson.ordered_dict import OrderedDict
from gluon import current
+from gluon.html import *
from gluon.storage import Storage
+from s3 import S3CustomController
+from templates.Nepal.layouts import IndexMenuLayout
def config(settings):
"""
@@ -23,7 +26,7 @@ def config(settings):
T = current.T
settings.base.system_name = T("Nepal Sahana Disaster Management Platform")
- #settings.base.system_name_short = T("Sahana")
+ settings.base.system_name_short = T("Sahana")
# PrePopulate data
settings.base.prepopulate = ("Nepal", "default/users")
@@ -39,6 +42,7 @@ def config(settings):
# Do new users need to be approved by an administrator prior to being able to login?
#settings.auth.registration_requires_approval = True
settings.auth.registration_requests_organisation = True
+ settings.auth.registration_requests_site = True
# Approval emails get sent to all admins
settings.mail.approver = "ADMIN"
@@ -101,13 +105,20 @@ def config(settings):
#settings.L10n.translate_gis_location = True
# Uncomment this to Translate Organisation Names/Acronyms
#settings.L10n.translate_org_organisation = True
+
# Finance settings
- #settings.fin.currencies = {
- # "EUR" : T("Euros"),
- # "GBP" : T("Great British Pounds"),
- # "USD" : T("United States Dollars"),
- #}
- #settings.fin.currency_default = "USD"
+ settings.fin.currencies = {
+ "NPR" : T("Nepalese Rupee"),
+ "AUD" : T("Australian Dollar"),
+ "EUR" : T("Euro"),
+ "GBP" : T("British Pound"),
+ "INR" : T("Indian Rupee"),
+ "KRW" : T("South-Korean Won"),
+ "JPY" : T("Japanese Yen"),
+ "NZD" : T("New Zealand Dollar"),
+ "USD" : T("United States Dollars"),
+ }
+ settings.fin.currency_default = "NPR"
# Security Policy
# http://eden.sahanafoundation.org/wiki/S3AAA#System-widePolicy
@@ -122,12 +133,118 @@ def config(settings):
#
settings.security.policy = 6 # Organisation-ACLs
+ # User Interface
+ settings.ui.icons = "font-awesome4"
+ settings.ui.custom_icons = {
+ "ambulance": "fa fa-ambulance",
+ "create":"fa fa-plus",
+ "hospital":"fa fa-hospital-o",
+ "receive": "fa fa-sign-in",
+ "recv_shipments": "fa fa-indent",
+ "resource": "fa fa-cube",
+ "send": "fa fa-sign-out",
+ "sent_shipments": "fa fa-outdent",
+ "shelter": "fa fa-home",
+ "site-current": "fa fa-square",
+ "sites-all": "fa fa-th",
+ "stock": "fa fa-cubes",
+ "user": "fa fa-user",
+ "volunteer": "fa fa-user",
+ "volunteers": "fa fa-users",
+ }
# -------------------------------------------------------------------------
+ # Module Settings
+ settings.org.sector = True
+ settings.ui.cluster = True
+
# Simple Requests
settings.req.req_type = ("Other",)
# Uncomment to disable the Commit step in the workflow & simply move direct to Ship
settings.req.use_commit = False
+ # Doesn't appear to work... Need inline field and/or component tab?
+ settings.hrm.multi_job_titles = True
+
+ # =========================================================================
+ def customise_inv_index():
+ """ Custom Inventory Index Page"""
+ response = current.response
+ response.title = T("Sahana : Warehouse Management")
+ s3 = response.s3
+ s3db = current.s3db
+ s3.stylesheets.append("../themes/Nepal/index.css")
+ s3.stylesheets.append("../styles/font-awesome.css")
+ S3CustomController._view("Nepal","inv_index.html")
+
+ site_id = current.auth.user.site_id
+ if site_id:
+ current_site = DIV(XML(T("You are currently managing stock for: %(site)s") % \
+ {"site":s3db.org_site_represent(site_id,
+ show_link = True)}),
+ _title = T("Contact Administrator to change your default facility."),
+ )
+ else:
+ current_site = ""
+ is_current_site = lambda i: site_id
+
+ IM = IndexMenuLayout
+ index_menu = IM()(IM("Receive", c="inv", f="recv", args="create",
+ vars={"recv.status":2},
+ icon="receive",
+ description=T("Receive a New shipment or an Existing shipment at your site."),
+ )(IM("Existing", args="summary", icon="list",vars={"recv.status":2}),
+ IM("New",args="create",icon="create")),
+ IM("Send", c="inv", f="send",
+ description=T("Send a shipment from your site."),
+ )(IM("Create",args="create",icon="create")),
+ IM("Stock", c="inv", f="inv_item",
+ icon="stock",
+ description=T("List of stock at sites."),
+ )(IM("Your Site",icon="your-site", check = is_current_site),
+ IM("All Sites",icon="all-sites")),
+ IM("Recvd. Shipments", c="inv", f="recv", args="summary",
+ vars={"recv.status__ne":2},
+ icon="recv_shipments",
+ description=T("List of received shipments."),
+ )(IM("Your Site",icon="your-site", check = is_current_site),
+ IM("All Sites",icon="all-sites")),
+ IM("Sent Shipments", c="inv", f="sent", args="summary",
+ icon="sent_shipments",
+ description=T("List of sent shipments."),
+ )(IM("Your Site",icon="your-site", check = is_current_site),
+ IM("All Sites",icon="all-sites")),
+ IM("Warehouse", c="inv", f="warehouse", args="summary",
+ icon="warehouse",
+ description=T("List of Warehouses."),
+ )(IM("View",args="summary",icon="list"),
+ IM("Create",args="create",icon="create"))
+ )
+
+ return dict(current_site = current_site,
+ index_menu = index_menu)
+ settings.customise_inv_home = customise_inv_index
+ # -------------------------------------------------------------------------
+ def customise_inv_recv_controller(**attr):
+ s3 = current.response.s3
+ # Custom PreP
+ standard_prep = s3.prep
+ def custom_prep(r):
+ # Call standard prep
+ if callable(standard_prep):
+ result = standard_prep(r)
+ if not result:
+ return False
+
+ # Customise titles
+ if r.vars.get("recv.status") == "2":
+ s3.crud_strings.inv_recv.title_list = T("Existing Shipments to Received")
+ if r.vars.get("recv.status__ne") == "2":
+ s3.crud_strings.inv_recv.title_list = T("Received Shipments")
+ return True
+ s3.prep = custom_prep
+ return attr
+ settings.customise_inv_recv_controller = customise_inv_recv_controller
+
# -------------------------------------------------------------------------
# Comment/uncomment modules here to disable/enable them
# Modules menu is defined in modules/eden/menu.py
@@ -185,7 +302,7 @@ def config(settings):
#description = "Central point to record details on People",
restricted = True,
access = "|1|", # Only Administrators can see this module in the default menu (access to controller is possible to all still)
- module_type = 10
+ module_type = None
)),
("org", Storage(
name_nice = T("Organizations"),
@@ -197,7 +314,7 @@ def config(settings):
name_nice = T("Staff"),
#description = "Human Resources Management",
restricted = True,
- module_type = 2,
+ module_type = 10,
)),
("vol", Storage(
name_nice = T("Volunteers"),
@@ -209,7 +326,7 @@ def config(settings):
name_nice = T("Content Management"),
#description = "Content Management System",
restricted = True,
- module_type = 10,
+ module_type = None,
)),
#("doc", Storage(
# name_nice = T("Documents"),
@@ -231,12 +348,12 @@ def config(settings):
restricted = True,
module_type = None, # Not displayed
)),
- #("inv", Storage(
- # name_nice = T("Warehouses"),
- # #description = "Receiving and Sending Items",
- # restricted = True,
- # module_type = 4
- #)),
+ ("inv", Storage(
+ name_nice = T("Warehouses"),
+ #description = "Receiving and Sending Items",
+ restricted = True,
+ module_type = 4
+ )),
#("asset", Storage(
# name_nice = T("Assets"),
# #description = "Recording and Assigning Assets",
@@ -256,12 +373,12 @@ def config(settings):
restricted = True,
module_type = 10,
)),
- #("project", Storage(
- # name_nice = T("Projects"),
- # #description = "Tracking of Projects, Activities and Tasks",
- # restricted = True,
- # module_type = 2
- #)),
+ ("project", Storage(
+ name_nice = T("Projects"),
+ #description = "Tracking of Projects, Activities and Tasks",
+ restricted = True,
+ module_type = 10
+ )),
("cr", Storage(
name_nice = T("Shelters"),
#description = "Tracks the location, capacity and breakdown of victims in Shelters",
@@ -272,10 +389,10 @@ def config(settings):
name_nice = T("Hospitals"),
#description = "Helps to monitor status of hospitals",
restricted = True,
- module_type = 10
+ module_type = 3
)),
("patient", Storage(
- name_nice = T("Patient Tracking"),
+ name_nice = T("Patients"),
#description = "Tracking of Patients",
restricted = True,
module_type = 10
@@ -286,12 +403,12 @@ def config(settings):
# restricted = True,
# module_type = 10,
#)),
- #("event", Storage(
- # name_nice = T("Events"),
- # #description = "Activate Events (e.g. from Scenario templates) for allocation of appropriate Resources (Human, Assets & Facilities).",
- # restricted = True,
- # module_type = 10,
- #)),
+ ("event", Storage(
+ name_nice = T("Events"),
+ #description = "Activate Events (e.g. from Scenario templates) for allocation of appropriate Resources (Human, Assets & Facilities).",
+ restricted = True,
+ module_type = 10,
+ )),
#("transport", Storage(
# name_nice = T("Transport"),
# restricted = True,
diff --git a/modules/templates/Nepal/controllers.py b/modules/templates/Nepal/controllers.py
index c7f83c6a9e..47a3f5011c 100644
--- a/modules/templates/Nepal/controllers.py
+++ b/modules/templates/Nepal/controllers.py
@@ -2,6 +2,7 @@
from gluon import *
from s3 import S3CustomController
+from templates.Nepal.layouts import IndexMenuLayout
THEME = "Nepal"
@@ -10,13 +11,14 @@ class index(S3CustomController):
""" Custom Home Page """
def __call__(self):
-
output = {}
T = current.T
response = current.response
s3 = response.s3
- s3.stylesheets.append("../themes/CERT/homepage.css")
+ s3.stylesheets.append("../themes/Nepal/index.css")
+ s3.stylesheets.append("../styles/font-awesome.css")
+ self._view(THEME, "index.html")
settings = current.deployment_settings
output["title"] = response.title = settings.get_system_name()
@@ -64,96 +66,46 @@ def __call__(self):
item = ""
output["item"] = item
- menus = [{"title": T("Volunteers"),
- "icon": "user",
- "description": T("Manage people who have volunteered for your organization, their contact details, certicates and trainings."),
- "module": "vol",
- "function": "volunteer",
- "buttons": [{"args": "summary",
- "icon": "list",
- "label": T("View"),
- },
- {"args": "create",
- "icon": "plus-sign",
- "label": T("Create"),
- }]
- },
- {"title": T("Shelters"),
- "icon": "home",
- "description": T("List of Shelters."),
- "module": "cr",
- "function": "shelter",
- "buttons": [{"args": "summary",
- "icon": "list",
- "label": T("View"),
- },
- {"args": "create",
- "icon": "plus-sign",
- "label": T("Create"),
- }]
- },
- {"title": T("Hospitals"),
- "icon": "h-sign",
- "description": T("List of Hospitals."),
- "module": "hms",
- "function": "hospital",
- "buttons": [{"args": "summary",
- "icon": "list",
- "label": T("View"),
- },
- {"args": "create",
- "icon": "plus-sign",
- "label": T("Create"),
- }]
- },
- {"title": T("Patients"),
- "icon": "ambulance",
- "description": T("List of Patients."),
- "module": "patient",
- "function": "patient",
- "buttons": [{"args": "summary",
- "icon": "list",
- "label": T("View"),
- },
- {"args": "create",
- "icon": "plus-sign",
- "label": T("Create"),
- }]
- },
- {"title": T("Requests"),
- "icon": "truck",
- "description": T("Requests for goods or services."),
- "module": "req",
- "function": "req",
- "args": None,
- "buttons": [{"args": "summary",
- "icon": "list",
- "label": T("View"),
- },
- {"args": "create",
- "icon": "plus-sign",
- "label": T("Create"),
- }]
- },
- {"title": T("Resources"),
- "icon": "wrench",
- "description": T("Resources that organizations have that are useful for response."),
- "module": "org",
- "function": "resource",
- "args": None,
- "buttons": [{"args": "summary",
- "icon": "list",
- "label": T("View"),
- },
- {"args": "create",
- "icon": "plus-sign",
- "label": T("Create"),
- }]
- },
- ]
- output["menus"] = menus
-
- self._view(THEME, "index.html")
+ IM = IndexMenuLayout
+ index_menu = IM()(IM("Organizations", c="org", f="organisation", args="summary",
+ icon="organisation",
+ description=T("List of Organizations responding with contact details and their activities to provide 3W (Who's Doing What Where)."),
+ )(IM("View", args="summary", icon="list"),
+ IM("Create", args="create", icon="create")),
+ IM("Volunteers", c="vol", f="volunteer", args="summary",
+ icon="volunteers",
+ description=T("Manage people volunteering for your organization, their contact details, certificates and trainings."),
+ )(IM("View", args="summary", icon="list"),
+ IM("Create", args="create", icon="create")),
+ IM("Hospitals", c="hms", f="hospital", args="summary",
+ description=T("List of Hospitals and other Health Facilities."),
+ )(IM("View", args="summary", icon="list"),
+ IM("Create", args="create", icon="create")),
+ IM("Warehouses", c="inv", f="index", args="summary",
+ description=T("Manage Warehouses, their stock and shipments."),
+ icon="warehouse",
+ )(IM("View", f="warehouse", args="summary", icon="list"),
+ IM("Create", f="warehouse", args="create", icon="create")),
+ IM("Resources", c="org", f="resource", args="summary",
+ description=T("Resources that organizations have that are useful for response."),
+ )(IM("View", args="summary", icon="list"),
+ IM("Create", args="create", icon="create")),
+ IM("Shelters", c="cr", f="shelter", args="summary",
+ description=T("List of Shelters for displaced people."),
+ )(IM("View", args="summary", icon="list"),
+ IM("Create", args="create", icon="create")),
+ IM("Patients", c="patient", f="patient", args="summary",
+ icon="ambulance",
+ description=T("Register and track Patients."),
+ )(IM("View", args="summary", icon="list"),
+ IM("Create", args="create", icon="create")),
+ IM("Requests", c="req", f="req", args="summary",
+ icon="truck",
+ description=T("Requests for resources or services."),
+ )(IM("View", args="summary", icon="list"),
+ IM("Create", args="create", icon="create")),
+ )
+ output["index_menu"] = index_menu
return output
# END =========================================================================
diff --git a/modules/templates/Nepal/css.cfg b/modules/templates/Nepal/css.cfg
deleted file mode 100644
index 0bcec78d39..0000000000
--- a/modules/templates/Nepal/css.cfg
+++ /dev/null
@@ -1,43 +0,0 @@
-../themes/default/layout.css
-../themes/default/xtheme-gray.css
-../themes/default/footer.css
-../themes/default/widgets.css
-../themes/default/shortcut.css
-../themes/default/homepage.css
-bootstrap/font-awesome.css
-plugins/jquery.cluetip.css
-plugins/jquery.dataTables.css
-plugins/jquery.dataTables.responsive.css
-#ui/accordion.css
-ui/core.css
-ui/autocomplete.css
-ui/button.css
-ui/datepicker.css
-ui/dialog.css
-# Needed for Delphi
-#ui/draggable.css
-ui/menu.css
-#ui/progressbar.css
-ui/resizable.css
-ui/selectmenu.css
-ui/slider.css
-#ui/sortable.css
-#ui/spinner.css
-ui/tabs.css
-#ui/tooltip.css
-ui/fgtimepicker.css
-ui/multiselect.css
-ui/timepicker-addon.css
-foundation/jquery-ui.theme.css
-gis/style.css
-zocial/zocial.css
-../themes/default/gis.css
-../themes/foundation/map.css
-../themes/default/mobile.css
-../themes/default/print.css
-d3/nv.d3.css
-../themes/default/report.css
-../themes/default/survey.css
-../themes/default/style.css
-#../themes/MY_THEME/style.css
-# Final line required for parsing
diff --git a/modules/templates/Nepal/layouts.py b/modules/templates/Nepal/layouts.py
new file mode 100644
index 0000000000..0895658e02
--- /dev/null
+++ b/modules/templates/Nepal/layouts.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+
+from gluon import *
+from s3 import *
+
+# =============================================================================
+class IndexMenuLayout(S3NavigationItem):
+ @staticmethod
+ def layout(item):
+ """ Layout Method (Item Renderer) """
+
+ # Manage flags: hide any disabled/unauthorized items
+ #if not item.authorized:
+ # enabled = False
+ # visible = False
+ #elif item.enabled is None or item.enabled:
+ # enabled = True
+ # visible = True
+
+ #if enabled and visible:
+ if item.parent is None:
+ # Return Menu
+ items = item.render_components()
+ return UL(items, _id="index-menu",
+ _class="small-block-grid-1 medium-block-grid-2 large-block-grid-4")
+ else:
+ if item.enabled:# and item.authorized:
+ attr = dict(_id = item.attr._id,
+ _href = item.url())
+
+ if item.components:
+ # Menu Icon
+ section = [A(H2(ICON(item.opts.get("icon",item.function)),
+ BR(),
+ item.label),
+ **attr),
+ ]
+ items = item.render_components()
+ if items:
+ section.append(DIV(items))
+ section.append(P(item.opts.description))
+ return LI(section)
+ else:
+ # Menu Icon Buttons
+ return A(ICON(item.opts.icon),
+ " ",
+ item.label,
+ _class="button small secondary",
+ **attr)
+# END =========================================================================
diff --git a/modules/templates/Nepal/menus.py b/modules/templates/Nepal/menus.py
new file mode 100644
index 0000000000..9eab6ea167
--- /dev/null
+++ b/modules/templates/Nepal/menus.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+
+from gluon import current
+from s3 import *
+from s3layouts import *
+try:
+ from .layouts import *
+except ImportError:
+ pass
+import s3menus as default
+
+# =============================================================================
+class S3OptionsMenu(default.S3OptionsMenu):
+ """
+ Custom Application Options Menu
+
+ Define one function per controller with the controller prefix as
+ function name and with "self" as its only argument (must be an
+ instance method!), and let it return the controller menu
+ definition as an instance of the layout (=an S3NavigationItem
+ subclass, standard: M).
+
+ In the standard layout, the main item in a controller menu does
+ not have a label. If you want to re-use a menu for multiple
+ controllers, do *not* define a controller setting (c="xxx") in
+ the main item.
+ """
+
+ def __init__(self, name):
+ """ Constructor """
+
+ try:
+ self.menu = getattr(self, name)()
+ except:
+ self.menu = None
+
+ # -------------------------------------------------------------------------
+ @staticmethod
+ def inv():
+ """ INV / Inventory """
+
+ ADMIN = current.session.s3.system_roles.ADMIN
+
+ current.s3db.inv_recv_crud_strings()
+ inv_recv_list = current.response.s3.crud_strings.inv_recv.title_list
+
+ settings = current.deployment_settings
+ use_adjust = lambda i: not settings.get_inv_direct_stock_edits()
+ use_commit = lambda i: settings.get_req_use_commit()
+
+ return M()(
+ M("Receive", c="inv", f="recv")(
+ M("New", m="create"),
+ M("Exiting", vars = {"a":1}),
+ M("Timeline", args="timeline"),
+ ),
+ M("Send", c="inv", f="send")(
+ M("New", m="create"),
+ M("Exiting", vars = {"a":1}),
+ M("Sent Shipments", m="summary"),
+ M("Search Shipped Items", f="track_item"),
+ M("Timeline", args="timeline"),
+ ),
+ M("Stock", c="inv", f="inv_item", m="summary")(
+ M("Adjust Stock Levels", f="adj", check=use_adjust),
+ M("Kitting", f="kitting"),
+ M("Import", f="inv_item", m="import", p="create"),
+ ),
+ M("Warehouses", c="inv", f="warehouse")(
+ M("Create", m="create"),
+ M("Import", m="import", p="create"),
+ ),
+ M("Requests", c="req", f="req")(
+ M("Create", m="create"),
+ M("Requested Items", f="req_item"),
+ ),
+ M("Commitments", c="req", f="commit", check=use_commit)(
+ ),
+ M("Reports", c="inv", f="inv_item")(
+ M("Stock Matrix", f="inv_item", m="report"),
+ M("Distribution Report", c="inv", f="track_item",
+ vars=dict(report="dist")),
+ ),
+ M("Administration", restrict=[ADMIN])(
+ M("Items", c="supply", f="item", m="summary"),
+ M("Catalogs", c="supply", f="catalog"),
+ M("Item Categories", c="supply", f="item_category",
+ restrict=[ADMIN]),
+ M("Suppliers", c="inv", f="supplier"),
+ M("Facilities", c="inv", f="facility"),
+ M("Facility Types", c="inv", f="facility_type",
+ restrict=[ADMIN]),
+ M("Warehouse Types", c="inv", f="warehouse_type",
+ restrict=[ADMIN]),
+ )
+ )
diff --git a/modules/templates/Nepal/tasks.cfg b/modules/templates/Nepal/tasks.cfg
index 9aefce6c21..90dcc44a57 100644
--- a/modules/templates/Nepal/tasks.cfg
+++ b/modules/templates/Nepal/tasks.cfg
@@ -43,3 +43,14 @@ org,office_type,default/office_type.csv,office_type.xsl
# -----------------------------------------------------------------------------
cms,post,cms_post.csv,post.xsl
# =============================================================================
+# DEMO Data Only
+# Inventory
+# inv,inv_item,inv_item.csv,inv_item.xsl
+# Requests
+#req,req,test/inv-mngt/req_req.csv,req.xsl
+#req,req_item,test/inv-mngt/req_item.csv,req_item.xsl
+# The order in which the items are shipped is important
+# so do not try to change the order or merge the following track_item files
+#inv,track_item,test/inv-mngt/track_item1.csv,track_item.xsl
+#inv,track_item,test/inv-mngt/track_item2.csv,track_item.xsl
+#inv,track_item,test/inv-mngt/track_item3.csv,track_item.xsl
diff --git a/modules/templates/Nepal/views/index.html b/modules/templates/Nepal/views/index.html
index a4d7585d4d..b9f305fb83 100644
--- a/modules/templates/Nepal/views/index.html
+++ b/modules/templates/Nepal/views/index.html
@@ -1,5 +1,5 @@
{{extend "layout.html"}}
-
+
{{try:}}
{{=title}}
{{except:}}
@@ -7,20 +7,5 @@
{{=title}}
{{=item}}
-
diff --git a/modules/templates/Nepal/views/inv_index.html b/modules/templates/Nepal/views/inv_index.html
new file mode 100644
index 0000000000..7042a07d1d
--- /dev/null
+++ b/modules/templates/Nepal/views/inv_index.html
@@ -0,0 +1,10 @@
+{{extend "layout.html"}}
+
+
{{="Sahana : Warehouse Management"}}
+
+ {{=T("This module allows Stock to be managed, requested & shipped between the Warehouses and other Inventories")}}
+ {{=T("Stock Items include both consumable supplies & those which will get turned into Assets at their destination.")}}
+ {{=current_site}}
+
+{{=index_menu}}
+
diff --git a/modules/templates/default/gis_hierarchy.csv b/modules/templates/default/gis_hierarchy.csv
index 793e5b63d9..907bd28e7e 100644
--- a/modules/templates/default/gis_hierarchy.csv
+++ b/modules/templates/default/gis_hierarchy.csv
@@ -29,7 +29,7 @@ SITE_DEFAULT,,"State / Province","County / District","City / Town / Village","Vi
,MP,Municipality,Village,,,,
,MV,"Atoll/City",Island,,,,
,MY,State,District,Mukim,,,
-,NP,Region,Zone,District,"Village Development Committee",Ward,
+,NP,Region,Zone,District,"VDC / Municipality",Ward,
,NZ,Region,Territorial Authority,,,,
,PG,Province,District,LLG,Village,,
,PH,Region,Province,"City / Municipality",Barangay,,
diff --git a/static/fonts/font-awesome/FontAwesome.otf b/static/fonts/font-awesome/FontAwesome.otf
new file mode 100644
index 0000000000..f7936cc1e7
Binary files /dev/null and b/static/fonts/font-awesome/FontAwesome.otf differ
diff --git a/static/fonts/font-awesome/fontawesome-webfont.eot b/static/fonts/font-awesome/fontawesome-webfont.eot
new file mode 100644
index 0000000000..33b2bb8005
Binary files /dev/null and b/static/fonts/font-awesome/fontawesome-webfont.eot differ
diff --git a/static/fonts/font-awesome/fontawesome-webfont.svg b/static/fonts/font-awesome/fontawesome-webfont.svg
new file mode 100644
index 0000000000..1ee89d4368
--- /dev/null
+++ b/static/fonts/font-awesome/fontawesome-webfont.svg
@@ -0,0 +1,565 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/static/fonts/font-awesome/fontawesome-webfont.ttf b/static/fonts/font-awesome/fontawesome-webfont.ttf
new file mode 100644
index 0000000000..ed9372f8ea
Binary files /dev/null and b/static/fonts/font-awesome/fontawesome-webfont.ttf differ
diff --git a/static/fonts/font-awesome/fontawesome-webfont.woff b/static/fonts/font-awesome/fontawesome-webfont.woff
new file mode 100644
index 0000000000..8b280b98fa
Binary files /dev/null and b/static/fonts/font-awesome/fontawesome-webfont.woff differ
diff --git a/static/fonts/font-awesome/fontawesome-webfont.woff2 b/static/fonts/font-awesome/fontawesome-webfont.woff2
new file mode 100644
index 0000000000..3311d58514
Binary files /dev/null and b/static/fonts/font-awesome/fontawesome-webfont.woff2 differ
diff --git a/static/styles/font-awesome.css b/static/styles/font-awesome.css
new file mode 100644
index 0000000000..4a567bd46b
--- /dev/null
+++ b/static/styles/font-awesome.css
@@ -0,0 +1,1802 @@
+/*!
+ * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ * SAHANA MODIFICATION: absolute file paths added for the font files to allow this file to be minified
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('/eden/static/fonts/font-awesome/fontawesome-webfont.eot?v=4.3.0');
+ src: url('/eden/static/fonts/font-awesome/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'), url('/eden/static/fonts/font-awesome/fontawesome-webfont.woff2?v=4.3.0') format('woff2'), url('/eden/static/fonts/font-awesome/fontawesome-webfont.woff?v=4.3.0') format('woff'), url('/eden/static/fonts/font-awesome/fontawesome-webfont.ttf?v=4.3.0') format('truetype'), url('/eden/static/fonts/font-awesome/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+.fa {
+ display: inline-block;
+ font: normal normal normal 14px/1 FontAwesome;
+ font-size: inherit;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ transform: translate(0, 0);
+}
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+ font-size: 1.33333333em;
+ line-height: 0.75em;
+ vertical-align: -15%;
+}
+.fa-2x {
+ font-size: 2em;
+}
+.fa-3x {
+ font-size: 3em;
+}
+.fa-4x {
+ font-size: 4em;
+}
+.fa-5x {
+ font-size: 5em;
+}
+.fa-fw {
+ width: 1.28571429em;
+ text-align: center;
+}
+.fa-ul {
+ padding-left: 0;
+ margin-left: 2.14285714em;
+ list-style-type: none;
+}
+.fa-ul > li {
+ position: relative;
+}
+.fa-li {
+ position: absolute;
+ left: -2.14285714em;
+ width: 2.14285714em;
+ top: 0.14285714em;
+ text-align: center;
+}
+.fa-li.fa-lg {
+ left: -1.85714286em;
+}
+.fa-border {
+ padding: .2em .25em .15em;
+ border: solid 0.08em #eeeeee;
+ border-radius: .1em;
+}
+.pull-right {
+ float: right;
+}
+.pull-left {
+ float: left;
+}
+.fa.pull-left {
+ margin-right: .3em;
+}
+.fa.pull-right {
+ margin-left: .3em;
+}
+.fa-spin {
+ -webkit-animation: fa-spin 2s infinite linear;
+ animation: fa-spin 2s infinite linear;
+}
+.fa-pulse {
+ -webkit-animation: fa-spin 1s infinite steps(8);
+ animation: fa-spin 1s infinite steps(8);
+}
+@-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);
+ }
+}
+.fa-rotate-90 {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+}
+.fa-rotate-180 {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg);
+}
+.fa-rotate-270 {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg);
+}
+.fa-flip-horizontal {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
+ -webkit-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+.fa-flip-vertical {
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
+ -webkit-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+ filter: none;
+}
+.fa-stack {
+ position: relative;
+ display: inline-block;
+ width: 2em;
+ height: 2em;
+ line-height: 2em;
+ vertical-align: middle;
+}
+.fa-stack-1x,
+.fa-stack-2x {
+ position: absolute;
+ left: 0;
+ width: 100%;
+ text-align: center;
+}
+.fa-stack-1x {
+ line-height: inherit;
+}
+.fa-stack-2x {
+ font-size: 2em;
+}
+.fa-inverse {
+ color: #ffffff;
+}
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+.fa-glass:before {
+ content: "\f000";
+}
+.fa-music:before {
+ content: "\f001";
+}
+.fa-search:before {
+ content: "\f002";
+}
+.fa-envelope-o:before {
+ content: "\f003";
+}
+.fa-heart:before {
+ content: "\f004";
+}
+.fa-star:before {
+ content: "\f005";
+}
+.fa-star-o:before {
+ content: "\f006";
+}
+.fa-user:before {
+ content: "\f007";
+}
+.fa-film:before {
+ content: "\f008";
+}
+.fa-th-large:before {
+ content: "\f009";
+}
+.fa-th:before {
+ content: "\f00a";
+}
+.fa-th-list:before {
+ content: "\f00b";
+}
+.fa-check:before {
+ content: "\f00c";
+}
+.fa-remove:before,
+.fa-close:before,
+.fa-times:before {
+ content: "\f00d";
+}
+.fa-search-plus:before {
+ content: "\f00e";
+}
+.fa-search-minus:before {
+ content: "\f010";
+}
+.fa-power-off:before {
+ content: "\f011";
+}
+.fa-signal:before {
+ content: "\f012";
+}
+.fa-gear:before,
+.fa-cog:before {
+ content: "\f013";
+}
+.fa-trash-o:before {
+ content: "\f014";
+}
+.fa-home:before {
+ content: "\f015";
+}
+.fa-file-o:before {
+ content: "\f016";
+}
+.fa-clock-o:before {
+ content: "\f017";
+}
+.fa-road:before {
+ content: "\f018";
+}
+.fa-download:before {
+ content: "\f019";
+}
+.fa-arrow-circle-o-down:before {
+ content: "\f01a";
+}
+.fa-arrow-circle-o-up:before {
+ content: "\f01b";
+}
+.fa-inbox:before {
+ content: "\f01c";
+}
+.fa-play-circle-o:before {
+ content: "\f01d";
+}
+.fa-rotate-right:before,
+.fa-repeat:before {
+ content: "\f01e";
+}
+.fa-refresh:before {
+ content: "\f021";
+}
+.fa-list-alt:before {
+ content: "\f022";
+}
+.fa-lock:before {
+ content: "\f023";
+}
+.fa-flag:before {
+ content: "\f024";
+}
+.fa-headphones:before {
+ content: "\f025";
+}
+.fa-volume-off:before {
+ content: "\f026";
+}
+.fa-volume-down:before {
+ content: "\f027";
+}
+.fa-volume-up:before {
+ content: "\f028";
+}
+.fa-qrcode:before {
+ content: "\f029";
+}
+.fa-barcode:before {
+ content: "\f02a";
+}
+.fa-tag:before {
+ content: "\f02b";
+}
+.fa-tags:before {
+ content: "\f02c";
+}
+.fa-book:before {
+ content: "\f02d";
+}
+.fa-bookmark:before {
+ content: "\f02e";
+}
+.fa-print:before {
+ content: "\f02f";
+}
+.fa-camera:before {
+ content: "\f030";
+}
+.fa-font:before {
+ content: "\f031";
+}
+.fa-bold:before {
+ content: "\f032";
+}
+.fa-italic:before {
+ content: "\f033";
+}
+.fa-text-height:before {
+ content: "\f034";
+}
+.fa-text-width:before {
+ content: "\f035";
+}
+.fa-align-left:before {
+ content: "\f036";
+}
+.fa-align-center:before {
+ content: "\f037";
+}
+.fa-align-right:before {
+ content: "\f038";
+}
+.fa-align-justify:before {
+ content: "\f039";
+}
+.fa-list:before {
+ content: "\f03a";
+}
+.fa-dedent:before,
+.fa-outdent:before {
+ content: "\f03b";
+}
+.fa-indent:before {
+ content: "\f03c";
+}
+.fa-video-camera:before {
+ content: "\f03d";
+}
+.fa-photo:before,
+.fa-image:before,
+.fa-picture-o:before {
+ content: "\f03e";
+}
+.fa-pencil:before {
+ content: "\f040";
+}
+.fa-map-marker:before {
+ content: "\f041";
+}
+.fa-adjust:before {
+ content: "\f042";
+}
+.fa-tint:before {
+ content: "\f043";
+}
+.fa-edit:before,
+.fa-pencil-square-o:before {
+ content: "\f044";
+}
+.fa-share-square-o:before {
+ content: "\f045";
+}
+.fa-check-square-o:before {
+ content: "\f046";
+}
+.fa-arrows:before {
+ content: "\f047";
+}
+.fa-step-backward:before {
+ content: "\f048";
+}
+.fa-fast-backward:before {
+ content: "\f049";
+}
+.fa-backward:before {
+ content: "\f04a";
+}
+.fa-play:before {
+ content: "\f04b";
+}
+.fa-pause:before {
+ content: "\f04c";
+}
+.fa-stop:before {
+ content: "\f04d";
+}
+.fa-forward:before {
+ content: "\f04e";
+}
+.fa-fast-forward:before {
+ content: "\f050";
+}
+.fa-step-forward:before {
+ content: "\f051";
+}
+.fa-eject:before {
+ content: "\f052";
+}
+.fa-chevron-left:before {
+ content: "\f053";
+}
+.fa-chevron-right:before {
+ content: "\f054";
+}
+.fa-plus-circle:before {
+ content: "\f055";
+}
+.fa-minus-circle:before {
+ content: "\f056";
+}
+.fa-times-circle:before {
+ content: "\f057";
+}
+.fa-check-circle:before {
+ content: "\f058";
+}
+.fa-question-circle:before {
+ content: "\f059";
+}
+.fa-info-circle:before {
+ content: "\f05a";
+}
+.fa-crosshairs:before {
+ content: "\f05b";
+}
+.fa-times-circle-o:before {
+ content: "\f05c";
+}
+.fa-check-circle-o:before {
+ content: "\f05d";
+}
+.fa-ban:before {
+ content: "\f05e";
+}
+.fa-arrow-left:before {
+ content: "\f060";
+}
+.fa-arrow-right:before {
+ content: "\f061";
+}
+.fa-arrow-up:before {
+ content: "\f062";
+}
+.fa-arrow-down:before {
+ content: "\f063";
+}
+.fa-mail-forward:before,
+.fa-share:before {
+ content: "\f064";
+}
+.fa-expand:before {
+ content: "\f065";
+}
+.fa-compress:before {
+ content: "\f066";
+}
+.fa-plus:before {
+ content: "\f067";
+}
+.fa-minus:before {
+ content: "\f068";
+}
+.fa-asterisk:before {
+ content: "\f069";
+}
+.fa-exclamation-circle:before {
+ content: "\f06a";
+}
+.fa-gift:before {
+ content: "\f06b";
+}
+.fa-leaf:before {
+ content: "\f06c";
+}
+.fa-fire:before {
+ content: "\f06d";
+}
+.fa-eye:before {
+ content: "\f06e";
+}
+.fa-eye-slash:before {
+ content: "\f070";
+}
+.fa-warning:before,
+.fa-exclamation-triangle:before {
+ content: "\f071";
+}
+.fa-plane:before {
+ content: "\f072";
+}
+.fa-calendar:before {
+ content: "\f073";
+}
+.fa-random:before {
+ content: "\f074";
+}
+.fa-comment:before {
+ content: "\f075";
+}
+.fa-magnet:before {
+ content: "\f076";
+}
+.fa-chevron-up:before {
+ content: "\f077";
+}
+.fa-chevron-down:before {
+ content: "\f078";
+}
+.fa-retweet:before {
+ content: "\f079";
+}
+.fa-shopping-cart:before {
+ content: "\f07a";
+}
+.fa-folder:before {
+ content: "\f07b";
+}
+.fa-folder-open:before {
+ content: "\f07c";
+}
+.fa-arrows-v:before {
+ content: "\f07d";
+}
+.fa-arrows-h:before {
+ content: "\f07e";
+}
+.fa-bar-chart-o:before,
+.fa-bar-chart:before {
+ content: "\f080";
+}
+.fa-twitter-square:before {
+ content: "\f081";
+}
+.fa-facebook-square:before {
+ content: "\f082";
+}
+.fa-camera-retro:before {
+ content: "\f083";
+}
+.fa-key:before {
+ content: "\f084";
+}
+.fa-gears:before,
+.fa-cogs:before {
+ content: "\f085";
+}
+.fa-comments:before {
+ content: "\f086";
+}
+.fa-thumbs-o-up:before {
+ content: "\f087";
+}
+.fa-thumbs-o-down:before {
+ content: "\f088";
+}
+.fa-star-half:before {
+ content: "\f089";
+}
+.fa-heart-o:before {
+ content: "\f08a";
+}
+.fa-sign-out:before {
+ content: "\f08b";
+}
+.fa-linkedin-square:before {
+ content: "\f08c";
+}
+.fa-thumb-tack:before {
+ content: "\f08d";
+}
+.fa-external-link:before {
+ content: "\f08e";
+}
+.fa-sign-in:before {
+ content: "\f090";
+}
+.fa-trophy:before {
+ content: "\f091";
+}
+.fa-github-square:before {
+ content: "\f092";
+}
+.fa-upload:before {
+ content: "\f093";
+}
+.fa-lemon-o:before {
+ content: "\f094";
+}
+.fa-phone:before {
+ content: "\f095";
+}
+.fa-square-o:before {
+ content: "\f096";
+}
+.fa-bookmark-o:before {
+ content: "\f097";
+}
+.fa-phone-square:before {
+ content: "\f098";
+}
+.fa-twitter:before {
+ content: "\f099";
+}
+.fa-facebook-f:before,
+.fa-facebook:before {
+ content: "\f09a";
+}
+.fa-github:before {
+ content: "\f09b";
+}
+.fa-unlock:before {
+ content: "\f09c";
+}
+.fa-credit-card:before {
+ content: "\f09d";
+}
+.fa-rss:before {
+ content: "\f09e";
+}
+.fa-hdd-o:before {
+ content: "\f0a0";
+}
+.fa-bullhorn:before {
+ content: "\f0a1";
+}
+.fa-bell:before {
+ content: "\f0f3";
+}
+.fa-certificate:before {
+ content: "\f0a3";
+}
+.fa-hand-o-right:before {
+ content: "\f0a4";
+}
+.fa-hand-o-left:before {
+ content: "\f0a5";
+}
+.fa-hand-o-up:before {
+ content: "\f0a6";
+}
+.fa-hand-o-down:before {
+ content: "\f0a7";
+}
+.fa-arrow-circle-left:before {
+ content: "\f0a8";
+}
+.fa-arrow-circle-right:before {
+ content: "\f0a9";
+}
+.fa-arrow-circle-up:before {
+ content: "\f0aa";
+}
+.fa-arrow-circle-down:before {
+ content: "\f0ab";
+}
+.fa-globe:before {
+ content: "\f0ac";
+}
+.fa-wrench:before {
+ content: "\f0ad";
+}
+.fa-tasks:before {
+ content: "\f0ae";
+}
+.fa-filter:before {
+ content: "\f0b0";
+}
+.fa-briefcase:before {
+ content: "\f0b1";
+}
+.fa-arrows-alt:before {
+ content: "\f0b2";
+}
+.fa-group:before,
+.fa-users:before {
+ content: "\f0c0";
+}
+.fa-chain:before,
+.fa-link:before {
+ content: "\f0c1";
+}
+.fa-cloud:before {
+ content: "\f0c2";
+}
+.fa-flask:before {
+ content: "\f0c3";
+}
+.fa-cut:before,
+.fa-scissors:before {
+ content: "\f0c4";
+}
+.fa-copy:before,
+.fa-files-o:before {
+ content: "\f0c5";
+}
+.fa-paperclip:before {
+ content: "\f0c6";
+}
+.fa-save:before,
+.fa-floppy-o:before {
+ content: "\f0c7";
+}
+.fa-square:before {
+ content: "\f0c8";
+}
+.fa-navicon:before,
+.fa-reorder:before,
+.fa-bars:before {
+ content: "\f0c9";
+}
+.fa-list-ul:before {
+ content: "\f0ca";
+}
+.fa-list-ol:before {
+ content: "\f0cb";
+}
+.fa-strikethrough:before {
+ content: "\f0cc";
+}
+.fa-underline:before {
+ content: "\f0cd";
+}
+.fa-table:before {
+ content: "\f0ce";
+}
+.fa-magic:before {
+ content: "\f0d0";
+}
+.fa-truck:before {
+ content: "\f0d1";
+}
+.fa-pinterest:before {
+ content: "\f0d2";
+}
+.fa-pinterest-square:before {
+ content: "\f0d3";
+}
+.fa-google-plus-square:before {
+ content: "\f0d4";
+}
+.fa-google-plus:before {
+ content: "\f0d5";
+}
+.fa-money:before {
+ content: "\f0d6";
+}
+.fa-caret-down:before {
+ content: "\f0d7";
+}
+.fa-caret-up:before {
+ content: "\f0d8";
+}
+.fa-caret-left:before {
+ content: "\f0d9";
+}
+.fa-caret-right:before {
+ content: "\f0da";
+}
+.fa-columns:before {
+ content: "\f0db";
+}
+.fa-unsorted:before,
+.fa-sort:before {
+ content: "\f0dc";
+}
+.fa-sort-down:before,
+.fa-sort-desc:before {
+ content: "\f0dd";
+}
+.fa-sort-up:before,
+.fa-sort-asc:before {
+ content: "\f0de";
+}
+.fa-envelope:before {
+ content: "\f0e0";
+}
+.fa-linkedin:before {
+ content: "\f0e1";
+}
+.fa-rotate-left:before,
+.fa-undo:before {
+ content: "\f0e2";
+}
+.fa-legal:before,
+.fa-gavel:before {
+ content: "\f0e3";
+}
+.fa-dashboard:before,
+.fa-tachometer:before {
+ content: "\f0e4";
+}
+.fa-comment-o:before {
+ content: "\f0e5";
+}
+.fa-comments-o:before {
+ content: "\f0e6";
+}
+.fa-flash:before,
+.fa-bolt:before {
+ content: "\f0e7";
+}
+.fa-sitemap:before {
+ content: "\f0e8";
+}
+.fa-umbrella:before {
+ content: "\f0e9";
+}
+.fa-paste:before,
+.fa-clipboard:before {
+ content: "\f0ea";
+}
+.fa-lightbulb-o:before {
+ content: "\f0eb";
+}
+.fa-exchange:before {
+ content: "\f0ec";
+}
+.fa-cloud-download:before {
+ content: "\f0ed";
+}
+.fa-cloud-upload:before {
+ content: "\f0ee";
+}
+.fa-user-md:before {
+ content: "\f0f0";
+}
+.fa-stethoscope:before {
+ content: "\f0f1";
+}
+.fa-suitcase:before {
+ content: "\f0f2";
+}
+.fa-bell-o:before {
+ content: "\f0a2";
+}
+.fa-coffee:before {
+ content: "\f0f4";
+}
+.fa-cutlery:before {
+ content: "\f0f5";
+}
+.fa-file-text-o:before {
+ content: "\f0f6";
+}
+.fa-building-o:before {
+ content: "\f0f7";
+}
+.fa-hospital-o:before {
+ content: "\f0f8";
+}
+.fa-ambulance:before {
+ content: "\f0f9";
+}
+.fa-medkit:before {
+ content: "\f0fa";
+}
+.fa-fighter-jet:before {
+ content: "\f0fb";
+}
+.fa-beer:before {
+ content: "\f0fc";
+}
+.fa-h-square:before {
+ content: "\f0fd";
+}
+.fa-plus-square:before {
+ content: "\f0fe";
+}
+.fa-angle-double-left:before {
+ content: "\f100";
+}
+.fa-angle-double-right:before {
+ content: "\f101";
+}
+.fa-angle-double-up:before {
+ content: "\f102";
+}
+.fa-angle-double-down:before {
+ content: "\f103";
+}
+.fa-angle-left:before {
+ content: "\f104";
+}
+.fa-angle-right:before {
+ content: "\f105";
+}
+.fa-angle-up:before {
+ content: "\f106";
+}
+.fa-angle-down:before {
+ content: "\f107";
+}
+.fa-desktop:before {
+ content: "\f108";
+}
+.fa-laptop:before {
+ content: "\f109";
+}
+.fa-tablet:before {
+ content: "\f10a";
+}
+.fa-mobile-phone:before,
+.fa-mobile:before {
+ content: "\f10b";
+}
+.fa-circle-o:before {
+ content: "\f10c";
+}
+.fa-quote-left:before {
+ content: "\f10d";
+}
+.fa-quote-right:before {
+ content: "\f10e";
+}
+.fa-spinner:before {
+ content: "\f110";
+}
+.fa-circle:before {
+ content: "\f111";
+}
+.fa-mail-reply:before,
+.fa-reply:before {
+ content: "\f112";
+}
+.fa-github-alt:before {
+ content: "\f113";
+}
+.fa-folder-o:before {
+ content: "\f114";
+}
+.fa-folder-open-o:before {
+ content: "\f115";
+}
+.fa-smile-o:before {
+ content: "\f118";
+}
+.fa-frown-o:before {
+ content: "\f119";
+}
+.fa-meh-o:before {
+ content: "\f11a";
+}
+.fa-gamepad:before {
+ content: "\f11b";
+}
+.fa-keyboard-o:before {
+ content: "\f11c";
+}
+.fa-flag-o:before {
+ content: "\f11d";
+}
+.fa-flag-checkered:before {
+ content: "\f11e";
+}
+.fa-terminal:before {
+ content: "\f120";
+}
+.fa-code:before {
+ content: "\f121";
+}
+.fa-mail-reply-all:before,
+.fa-reply-all:before {
+ content: "\f122";
+}
+.fa-star-half-empty:before,
+.fa-star-half-full:before,
+.fa-star-half-o:before {
+ content: "\f123";
+}
+.fa-location-arrow:before {
+ content: "\f124";
+}
+.fa-crop:before {
+ content: "\f125";
+}
+.fa-code-fork:before {
+ content: "\f126";
+}
+.fa-unlink:before,
+.fa-chain-broken:before {
+ content: "\f127";
+}
+.fa-question:before {
+ content: "\f128";
+}
+.fa-info:before {
+ content: "\f129";
+}
+.fa-exclamation:before {
+ content: "\f12a";
+}
+.fa-superscript:before {
+ content: "\f12b";
+}
+.fa-subscript:before {
+ content: "\f12c";
+}
+.fa-eraser:before {
+ content: "\f12d";
+}
+.fa-puzzle-piece:before {
+ content: "\f12e";
+}
+.fa-microphone:before {
+ content: "\f130";
+}
+.fa-microphone-slash:before {
+ content: "\f131";
+}
+.fa-shield:before {
+ content: "\f132";
+}
+.fa-calendar-o:before {
+ content: "\f133";
+}
+.fa-fire-extinguisher:before {
+ content: "\f134";
+}
+.fa-rocket:before {
+ content: "\f135";
+}
+.fa-maxcdn:before {
+ content: "\f136";
+}
+.fa-chevron-circle-left:before {
+ content: "\f137";
+}
+.fa-chevron-circle-right:before {
+ content: "\f138";
+}
+.fa-chevron-circle-up:before {
+ content: "\f139";
+}
+.fa-chevron-circle-down:before {
+ content: "\f13a";
+}
+.fa-html5:before {
+ content: "\f13b";
+}
+.fa-css3:before {
+ content: "\f13c";
+}
+.fa-anchor:before {
+ content: "\f13d";
+}
+.fa-unlock-alt:before {
+ content: "\f13e";
+}
+.fa-bullseye:before {
+ content: "\f140";
+}
+.fa-ellipsis-h:before {
+ content: "\f141";
+}
+.fa-ellipsis-v:before {
+ content: "\f142";
+}
+.fa-rss-square:before {
+ content: "\f143";
+}
+.fa-play-circle:before {
+ content: "\f144";
+}
+.fa-ticket:before {
+ content: "\f145";
+}
+.fa-minus-square:before {
+ content: "\f146";
+}
+.fa-minus-square-o:before {
+ content: "\f147";
+}
+.fa-level-up:before {
+ content: "\f148";
+}
+.fa-level-down:before {
+ content: "\f149";
+}
+.fa-check-square:before {
+ content: "\f14a";
+}
+.fa-pencil-square:before {
+ content: "\f14b";
+}
+.fa-external-link-square:before {
+ content: "\f14c";
+}
+.fa-share-square:before {
+ content: "\f14d";
+}
+.fa-compass:before {
+ content: "\f14e";
+}
+.fa-toggle-down:before,
+.fa-caret-square-o-down:before {
+ content: "\f150";
+}
+.fa-toggle-up:before,
+.fa-caret-square-o-up:before {
+ content: "\f151";
+}
+.fa-toggle-right:before,
+.fa-caret-square-o-right:before {
+ content: "\f152";
+}
+.fa-euro:before,
+.fa-eur:before {
+ content: "\f153";
+}
+.fa-gbp:before {
+ content: "\f154";
+}
+.fa-dollar:before,
+.fa-usd:before {
+ content: "\f155";
+}
+.fa-rupee:before,
+.fa-inr:before {
+ content: "\f156";
+}
+.fa-cny:before,
+.fa-rmb:before,
+.fa-yen:before,
+.fa-jpy:before {
+ content: "\f157";
+}
+.fa-ruble:before,
+.fa-rouble:before,
+.fa-rub:before {
+ content: "\f158";
+}
+.fa-won:before,
+.fa-krw:before {
+ content: "\f159";
+}
+.fa-bitcoin:before,
+.fa-btc:before {
+ content: "\f15a";
+}
+.fa-file:before {
+ content: "\f15b";
+}
+.fa-file-text:before {
+ content: "\f15c";
+}
+.fa-sort-alpha-asc:before {
+ content: "\f15d";
+}
+.fa-sort-alpha-desc:before {
+ content: "\f15e";
+}
+.fa-sort-amount-asc:before {
+ content: "\f160";
+}
+.fa-sort-amount-desc:before {
+ content: "\f161";
+}
+.fa-sort-numeric-asc:before {
+ content: "\f162";
+}
+.fa-sort-numeric-desc:before {
+ content: "\f163";
+}
+.fa-thumbs-up:before {
+ content: "\f164";
+}
+.fa-thumbs-down:before {
+ content: "\f165";
+}
+.fa-youtube-square:before {
+ content: "\f166";
+}
+.fa-youtube:before {
+ content: "\f167";
+}
+.fa-xing:before {
+ content: "\f168";
+}
+.fa-xing-square:before {
+ content: "\f169";
+}
+.fa-youtube-play:before {
+ content: "\f16a";
+}
+.fa-dropbox:before {
+ content: "\f16b";
+}
+.fa-stack-overflow:before {
+ content: "\f16c";
+}
+.fa-instagram:before {
+ content: "\f16d";
+}
+.fa-flickr:before {
+ content: "\f16e";
+}
+.fa-adn:before {
+ content: "\f170";
+}
+.fa-bitbucket:before {
+ content: "\f171";
+}
+.fa-bitbucket-square:before {
+ content: "\f172";
+}
+.fa-tumblr:before {
+ content: "\f173";
+}
+.fa-tumblr-square:before {
+ content: "\f174";
+}
+.fa-long-arrow-down:before {
+ content: "\f175";
+}
+.fa-long-arrow-up:before {
+ content: "\f176";
+}
+.fa-long-arrow-left:before {
+ content: "\f177";
+}
+.fa-long-arrow-right:before {
+ content: "\f178";
+}
+.fa-apple:before {
+ content: "\f179";
+}
+.fa-windows:before {
+ content: "\f17a";
+}
+.fa-android:before {
+ content: "\f17b";
+}
+.fa-linux:before {
+ content: "\f17c";
+}
+.fa-dribbble:before {
+ content: "\f17d";
+}
+.fa-skype:before {
+ content: "\f17e";
+}
+.fa-foursquare:before {
+ content: "\f180";
+}
+.fa-trello:before {
+ content: "\f181";
+}
+.fa-female:before {
+ content: "\f182";
+}
+.fa-male:before {
+ content: "\f183";
+}
+.fa-gittip:before,
+.fa-gratipay:before {
+ content: "\f184";
+}
+.fa-sun-o:before {
+ content: "\f185";
+}
+.fa-moon-o:before {
+ content: "\f186";
+}
+.fa-archive:before {
+ content: "\f187";
+}
+.fa-bug:before {
+ content: "\f188";
+}
+.fa-vk:before {
+ content: "\f189";
+}
+.fa-weibo:before {
+ content: "\f18a";
+}
+.fa-renren:before {
+ content: "\f18b";
+}
+.fa-pagelines:before {
+ content: "\f18c";
+}
+.fa-stack-exchange:before {
+ content: "\f18d";
+}
+.fa-arrow-circle-o-right:before {
+ content: "\f18e";
+}
+.fa-arrow-circle-o-left:before {
+ content: "\f190";
+}
+.fa-toggle-left:before,
+.fa-caret-square-o-left:before {
+ content: "\f191";
+}
+.fa-dot-circle-o:before {
+ content: "\f192";
+}
+.fa-wheelchair:before {
+ content: "\f193";
+}
+.fa-vimeo-square:before {
+ content: "\f194";
+}
+.fa-turkish-lira:before,
+.fa-try:before {
+ content: "\f195";
+}
+.fa-plus-square-o:before {
+ content: "\f196";
+}
+.fa-space-shuttle:before {
+ content: "\f197";
+}
+.fa-slack:before {
+ content: "\f198";
+}
+.fa-envelope-square:before {
+ content: "\f199";
+}
+.fa-wordpress:before {
+ content: "\f19a";
+}
+.fa-openid:before {
+ content: "\f19b";
+}
+.fa-institution:before,
+.fa-bank:before,
+.fa-university:before {
+ content: "\f19c";
+}
+.fa-mortar-board:before,
+.fa-graduation-cap:before {
+ content: "\f19d";
+}
+.fa-yahoo:before {
+ content: "\f19e";
+}
+.fa-google:before {
+ content: "\f1a0";
+}
+.fa-reddit:before {
+ content: "\f1a1";
+}
+.fa-reddit-square:before {
+ content: "\f1a2";
+}
+.fa-stumbleupon-circle:before {
+ content: "\f1a3";
+}
+.fa-stumbleupon:before {
+ content: "\f1a4";
+}
+.fa-delicious:before {
+ content: "\f1a5";
+}
+.fa-digg:before {
+ content: "\f1a6";
+}
+.fa-pied-piper:before {
+ content: "\f1a7";
+}
+.fa-pied-piper-alt:before {
+ content: "\f1a8";
+}
+.fa-drupal:before {
+ content: "\f1a9";
+}
+.fa-joomla:before {
+ content: "\f1aa";
+}
+.fa-language:before {
+ content: "\f1ab";
+}
+.fa-fax:before {
+ content: "\f1ac";
+}
+.fa-building:before {
+ content: "\f1ad";
+}
+.fa-child:before {
+ content: "\f1ae";
+}
+.fa-paw:before {
+ content: "\f1b0";
+}
+.fa-spoon:before {
+ content: "\f1b1";
+}
+.fa-cube:before {
+ content: "\f1b2";
+}
+.fa-cubes:before {
+ content: "\f1b3";
+}
+.fa-behance:before {
+ content: "\f1b4";
+}
+.fa-behance-square:before {
+ content: "\f1b5";
+}
+.fa-steam:before {
+ content: "\f1b6";
+}
+.fa-steam-square:before {
+ content: "\f1b7";
+}
+.fa-recycle:before {
+ content: "\f1b8";
+}
+.fa-automobile:before,
+.fa-car:before {
+ content: "\f1b9";
+}
+.fa-cab:before,
+.fa-taxi:before {
+ content: "\f1ba";
+}
+.fa-tree:before {
+ content: "\f1bb";
+}
+.fa-spotify:before {
+ content: "\f1bc";
+}
+.fa-deviantart:before {
+ content: "\f1bd";
+}
+.fa-soundcloud:before {
+ content: "\f1be";
+}
+.fa-database:before {
+ content: "\f1c0";
+}
+.fa-file-pdf-o:before {
+ content: "\f1c1";
+}
+.fa-file-word-o:before {
+ content: "\f1c2";
+}
+.fa-file-excel-o:before {
+ content: "\f1c3";
+}
+.fa-file-powerpoint-o:before {
+ content: "\f1c4";
+}
+.fa-file-photo-o:before,
+.fa-file-picture-o:before,
+.fa-file-image-o:before {
+ content: "\f1c5";
+}
+.fa-file-zip-o:before,
+.fa-file-archive-o:before {
+ content: "\f1c6";
+}
+.fa-file-sound-o:before,
+.fa-file-audio-o:before {
+ content: "\f1c7";
+}
+.fa-file-movie-o:before,
+.fa-file-video-o:before {
+ content: "\f1c8";
+}
+.fa-file-code-o:before {
+ content: "\f1c9";
+}
+.fa-vine:before {
+ content: "\f1ca";
+}
+.fa-codepen:before {
+ content: "\f1cb";
+}
+.fa-jsfiddle:before {
+ content: "\f1cc";
+}
+.fa-life-bouy:before,
+.fa-life-buoy:before,
+.fa-life-saver:before,
+.fa-support:before,
+.fa-life-ring:before {
+ content: "\f1cd";
+}
+.fa-circle-o-notch:before {
+ content: "\f1ce";
+}
+.fa-ra:before,
+.fa-rebel:before {
+ content: "\f1d0";
+}
+.fa-ge:before,
+.fa-empire:before {
+ content: "\f1d1";
+}
+.fa-git-square:before {
+ content: "\f1d2";
+}
+.fa-git:before {
+ content: "\f1d3";
+}
+.fa-hacker-news:before {
+ content: "\f1d4";
+}
+.fa-tencent-weibo:before {
+ content: "\f1d5";
+}
+.fa-qq:before {
+ content: "\f1d6";
+}
+.fa-wechat:before,
+.fa-weixin:before {
+ content: "\f1d7";
+}
+.fa-send:before,
+.fa-paper-plane:before {
+ content: "\f1d8";
+}
+.fa-send-o:before,
+.fa-paper-plane-o:before {
+ content: "\f1d9";
+}
+.fa-history:before {
+ content: "\f1da";
+}
+.fa-genderless:before,
+.fa-circle-thin:before {
+ content: "\f1db";
+}
+.fa-header:before {
+ content: "\f1dc";
+}
+.fa-paragraph:before {
+ content: "\f1dd";
+}
+.fa-sliders:before {
+ content: "\f1de";
+}
+.fa-share-alt:before {
+ content: "\f1e0";
+}
+.fa-share-alt-square:before {
+ content: "\f1e1";
+}
+.fa-bomb:before {
+ content: "\f1e2";
+}
+.fa-soccer-ball-o:before,
+.fa-futbol-o:before {
+ content: "\f1e3";
+}
+.fa-tty:before {
+ content: "\f1e4";
+}
+.fa-binoculars:before {
+ content: "\f1e5";
+}
+.fa-plug:before {
+ content: "\f1e6";
+}
+.fa-slideshare:before {
+ content: "\f1e7";
+}
+.fa-twitch:before {
+ content: "\f1e8";
+}
+.fa-yelp:before {
+ content: "\f1e9";
+}
+.fa-newspaper-o:before {
+ content: "\f1ea";
+}
+.fa-wifi:before {
+ content: "\f1eb";
+}
+.fa-calculator:before {
+ content: "\f1ec";
+}
+.fa-paypal:before {
+ content: "\f1ed";
+}
+.fa-google-wallet:before {
+ content: "\f1ee";
+}
+.fa-cc-visa:before {
+ content: "\f1f0";
+}
+.fa-cc-mastercard:before {
+ content: "\f1f1";
+}
+.fa-cc-discover:before {
+ content: "\f1f2";
+}
+.fa-cc-amex:before {
+ content: "\f1f3";
+}
+.fa-cc-paypal:before {
+ content: "\f1f4";
+}
+.fa-cc-stripe:before {
+ content: "\f1f5";
+}
+.fa-bell-slash:before {
+ content: "\f1f6";
+}
+.fa-bell-slash-o:before {
+ content: "\f1f7";
+}
+.fa-trash:before {
+ content: "\f1f8";
+}
+.fa-copyright:before {
+ content: "\f1f9";
+}
+.fa-at:before {
+ content: "\f1fa";
+}
+.fa-eyedropper:before {
+ content: "\f1fb";
+}
+.fa-paint-brush:before {
+ content: "\f1fc";
+}
+.fa-birthday-cake:before {
+ content: "\f1fd";
+}
+.fa-area-chart:before {
+ content: "\f1fe";
+}
+.fa-pie-chart:before {
+ content: "\f200";
+}
+.fa-line-chart:before {
+ content: "\f201";
+}
+.fa-lastfm:before {
+ content: "\f202";
+}
+.fa-lastfm-square:before {
+ content: "\f203";
+}
+.fa-toggle-off:before {
+ content: "\f204";
+}
+.fa-toggle-on:before {
+ content: "\f205";
+}
+.fa-bicycle:before {
+ content: "\f206";
+}
+.fa-bus:before {
+ content: "\f207";
+}
+.fa-ioxhost:before {
+ content: "\f208";
+}
+.fa-angellist:before {
+ content: "\f209";
+}
+.fa-cc:before {
+ content: "\f20a";
+}
+.fa-shekel:before,
+.fa-sheqel:before,
+.fa-ils:before {
+ content: "\f20b";
+}
+.fa-meanpath:before {
+ content: "\f20c";
+}
+.fa-buysellads:before {
+ content: "\f20d";
+}
+.fa-connectdevelop:before {
+ content: "\f20e";
+}
+.fa-dashcube:before {
+ content: "\f210";
+}
+.fa-forumbee:before {
+ content: "\f211";
+}
+.fa-leanpub:before {
+ content: "\f212";
+}
+.fa-sellsy:before {
+ content: "\f213";
+}
+.fa-shirtsinbulk:before {
+ content: "\f214";
+}
+.fa-simplybuilt:before {
+ content: "\f215";
+}
+.fa-skyatlas:before {
+ content: "\f216";
+}
+.fa-cart-plus:before {
+ content: "\f217";
+}
+.fa-cart-arrow-down:before {
+ content: "\f218";
+}
+.fa-diamond:before {
+ content: "\f219";
+}
+.fa-ship:before {
+ content: "\f21a";
+}
+.fa-user-secret:before {
+ content: "\f21b";
+}
+.fa-motorcycle:before {
+ content: "\f21c";
+}
+.fa-street-view:before {
+ content: "\f21d";
+}
+.fa-heartbeat:before {
+ content: "\f21e";
+}
+.fa-venus:before {
+ content: "\f221";
+}
+.fa-mars:before {
+ content: "\f222";
+}
+.fa-mercury:before {
+ content: "\f223";
+}
+.fa-transgender:before {
+ content: "\f224";
+}
+.fa-transgender-alt:before {
+ content: "\f225";
+}
+.fa-venus-double:before {
+ content: "\f226";
+}
+.fa-mars-double:before {
+ content: "\f227";
+}
+.fa-venus-mars:before {
+ content: "\f228";
+}
+.fa-mars-stroke:before {
+ content: "\f229";
+}
+.fa-mars-stroke-v:before {
+ content: "\f22a";
+}
+.fa-mars-stroke-h:before {
+ content: "\f22b";
+}
+.fa-neuter:before {
+ content: "\f22c";
+}
+.fa-facebook-official:before {
+ content: "\f230";
+}
+.fa-pinterest-p:before {
+ content: "\f231";
+}
+.fa-whatsapp:before {
+ content: "\f232";
+}
+.fa-server:before {
+ content: "\f233";
+}
+.fa-user-plus:before {
+ content: "\f234";
+}
+.fa-user-times:before {
+ content: "\f235";
+}
+.fa-hotel:before,
+.fa-bed:before {
+ content: "\f236";
+}
+.fa-viacoin:before {
+ content: "\f237";
+}
+.fa-train:before {
+ content: "\f238";
+}
+.fa-subway:before {
+ content: "\f239";
+}
+.fa-medium:before {
+ content: "\f23a";
+}
diff --git a/static/themes/CERT/homepage.css b/static/themes/CERT/homepage.css
index b13b1b8408..b0434591fd 100644
--- a/static/themes/CERT/homepage.css
+++ b/static/themes/CERT/homepage.css
@@ -2,14 +2,34 @@
/* Home page specific */
-#home h1,
-#home h2 {
+div#menu-page h1 {
+ margin-top: 10px;
+ font-size: 2.75rem;
+}
+
+.home-page h1 {
+ text-align: center;
+}
+
+div#menu-page h2 {
+ font-size: 2rem;
text-align: center;
}
-#home .row,
-#home .panel {
+div#menu-page h1,
+div#menu-page h2 {
+ font-weight: inherit;
+ background: None;
+ padding: 0;
+}
+
+.home-page .row,
+.home-page .panel {
margin: 0 auto;
+}
+
+#menu-page .row,
+#menu-page .panel {
max-width: 980px;
}
diff --git a/static/themes/Nepal/index.css b/static/themes/Nepal/index.css
new file mode 100644
index 0000000000..54915cc548
--- /dev/null
+++ b/static/themes/Nepal/index.css
@@ -0,0 +1,48 @@
+@charset "UTF-8";
+
+/* Index page specific */
+
+
+div#content h1 {
+ margin-top: 10px;
+ font-size: 2rem;
+}
+
+#index-page {
+ margin-top: 10px;
+ max-width: 980px;
+}
+
+.default h1 {
+ text-align: center;
+}
+.default {
+ margin: 0 auto;
+}
+
+div#index-page h2 {
+ text-align: center;
+ font-size: 1.5rem;
+}
+div#index-page.default h2 {
+ font-size: 2rem;
+}
+
+div#index-page h1,
+div#index-page h2 {
+ font-weight: inherit;
+ background: None;
+ padding: 0;
+}
+
+#index-menu h2 i {
+ font-size: 4rem;
+}
+
+#index-menu li {
+ text-align: center;
+}
+
+#index-menu p {
+ margin-bottom: 0;
+}
\ No newline at end of file