diff --git a/controllers/default.py b/controllers/default.py index 66906edfe5..95fefb951d 100755 --- a/controllers/default.py +++ b/controllers/default.py @@ -64,7 +64,7 @@ def register_validation(form): # ============================================================================= def index(): """ Main Home Page """ - + auth.settings.register_onvalidation = register_validation auth.configure_user_fields() 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/s3codecs/xls.py b/modules/s3/s3codecs/xls.py index e6b836b9a5..3b33dfb314 100644 --- a/modules/s3/s3codecs/xls.py +++ b/modules/s3/s3codecs/xls.py @@ -171,6 +171,9 @@ def encode(self, data_source, **attr): list_fields = attr.get("list_fields") if not list_fields: list_fields = data_source.list_fields() + # Always export comments field + if "comments" in data_source.fields and "comments" not in list_fields: + list_fields.append("comments") group = attr.get("dt_group") use_colour = attr.get("use_colour", False) 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 18d2f873b6..b03886e1e8 100644 --- a/modules/s3/s3widgets.py +++ b/modules/s3/s3widgets.py @@ -7911,75 +7911,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 1de73d62e4..d27e500e26 100644 --- a/modules/s3db/hrm.py +++ b/modules/s3db/hrm.py @@ -5165,7 +5165,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 11aa3b55ed..f16fe06128 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 0797f20c45..c8b14f5480 100644 --- a/modules/s3db/org.py +++ b/modules/s3db/org.py @@ -322,7 +322,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", @@ -1898,11 +1898,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 8c4f6faebd..9a1bd5b403 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 27d9cbec42..80141a20c1 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..b19830275a 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,11 +1470,7 @@ def org(): M("Create", m="create"), M("Import", m="import"), ), - M("Resource Inventory", f="resource")( - M("Create", m="create"), - M("Import", m="import") - ), - M("Resources", f="resource", m="summary")( + M("Resources", f="resource")( M("Create", m="create"), M("Import", m="import") ), diff --git a/modules/templates/IFRC/config.py b/modules/templates/IFRC/config.py index 0bfd5017df..b05228970b 100644 --- a/modules/templates/IFRC/config.py +++ b/modules/templates/IFRC/config.py @@ -483,78 +483,8 @@ def currency_default(default): settings.hrm.activity_types = {"rdrt": "RDRT Mission"} # ----------------------------------------------------------------------------- - # Projects - # Uncomment this to use settings suitable for a global/regional organisation (e.g. DRR) - settings.project.mode_3w = True - # Uncomment this to use DRR (Disaster Risk Reduction) extensions - settings.project.mode_drr = True - # Uncomment this to use Activity Types for Activities & Projects - settings.project.activity_types = True - # Uncomment this to use Codes for projects - settings.project.codes = True - # Uncomment this to call project locations 'Communities' - settings.project.community = True - # Uncomment this to enable Hazards in 3W projects - settings.project.hazards = True - # Uncomment this to use multiple Budgets per project - settings.project.multiple_budgets = True - # Uncomment this to use multiple Organisations per project - settings.project.multiple_organisations = True - # Uncomment this to enable Programmes in projects - settings.project.programmes = True - # Uncomment this to enable Themes in 3W projects - settings.project.themes = True - # Uncomment this to customise - # Links to Filtered Components for Donors & Partners - settings.project.organisation_roles = { - 1: T("Host National Society"), - 2: T("Partner"), - 3: T("Donor"), - #4: T("Customer"), # T("Beneficiary")? - #5: T("Supplier"), - 9: T("Partner National Society"), - } - - # ----------------------------------------------------------------------------- - # Inventory Management - settings.inv.show_mode_of_transport = True - settings.inv.send_show_time_in = True - #settings.inv.collapse_tabs = True - # Uncomment if you need a simpler (but less accountable) process for managing stock levels - settings.inv.direct_stock_edits = True - settings.inv.org_dependent_warehouse_types = True - # Settings for HNRC: - #settings.inv.stock_count = False - #settings.inv.item_status = {#0: current.messages["NONE"], # Not defined yet - # 0: T("Good"), - # 1: T("Damaged"), - # #1: T("Dump"), - # #2: T("Sale"), - # #3: T("Reject"), - # #4: T("Surplus") - # } - #settings.inv.recv_types = {#0: current.messages["NONE"], In Shipment Types - # #11: T("Internal Shipment"), In Shipment Types - # 32: T("Donation"), - # 34: T("Purchase"), - # 36: T("Consignment"), # Borrowed - # 37: T("In Transit"), # Loaning warehouse space to another agency - # } - - # ----------------------------------------------------------------------------- - # Request Management - # Uncomment to disable Inline Forms in Requests module - settings.req.inline_forms = False - settings.req.req_type = ["Stock"] - settings.req.use_commit = False - # Should Requests ask whether Transportation is required? - settings.req.ask_transport = True - settings.req.pack_values = False - # Disable Request Matching as we don't want users making requests to see what stock is available - #settings.req.prompt_match = False # HNRC - # Uncomment to disable Recurring Request - #settings.req.recurring = False # HNRC - + # Supply / Inventory / Warehouse + settings.supply.autocomplete = True # ============================================================================= # Template Modules # Comment/uncomment modules here to disable/enable them diff --git a/modules/templates/Nepal/config.py b/modules/templates/Nepal/config.py index d5754b9175..795e3862dc 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 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,120 @@ 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") + + response.title + + 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 +304,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 +316,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 +328,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 +350,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 +375,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 +391,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 +405,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..f5968bdbc7 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 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..f6cd750b44 --- /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..600937447b --- /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}}
-
- {{for menu in menus:}} -
- -

-

{{=menu["title"]}}

-
- -

{{=menu["description"]}}

-
- {{pass}} +{{=index_menu}}
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