<p>Development has placed extension templating back to a working state. Pushing back to opentech since it is working enough for front end development.</p>

<hr>

<h4>You can merge this Pull Request by running</h4>
<pre>  git pull https://github.com/elationfoundation/commotion-client Extension_Templating</pre>
<p>Or view, comment on, or merge it at:</p>
<p>  <a href='https://github.com/opentechinstitute/commotion-client/pull/25'>https://github.com/opentechinstitute/commotion-client/pull/25</a></p>

<h4>Commit Summary</h4>
<ul>
  <li>added creash and error signals to template and tutorial</li>
  <li>added a basic commotion form stylesheet</li>
  <li>Prepared main_window for loading extensions</li>
  <li>Changed custom exit function name to not overwrite default exit function</li>
  <li>added clean up functions to tutorial files</li>
  <li>added viewport clean-up and swap functions</li>
  <li>added clean up functions to welcome page</li>
  <li>replaced exception log.debug logging with log.exception calls</li>
  <li>cleaned up exception handling</li>
  <li>added extension manager core</li>
  <li>added proper usage of default values to settings loading.</li>
  <li>Fixed filename to == PEP8</li>
  <li>added a config file validation object</li>
  <li>applied a shorter variable for qt logging functions</li>
  <li>added file management needed for extension management</li>
  <li>fixed a mis-typed variable</li>
  <li>Cleaned up documentation</li>
  <li>started scoping out extension management functionality.</li>
  <li>Cleaned up validation and file system utils</li>
  <li>added basic networking validation class</li>
  <li>completed extension manager</li>
  <li>cleaned up code to be pep8 compliant-ier</li>
  <li>hooked extension loader to extension manager</li>
  <li>fixed incorrect loading of fs_utils</li>
  <li>cleaned up some markdown</li>
  <li>moved config_manager to core</li>
  <li>fixed some weirdness</li>
  <li>messed up links and did not realize till it was already pushed.</li>
  <li>changed config_manager to config_editor</li>
  <li>removed old todo, as it is no longer needed.</li>
  <li>moved all config files into config directories</li>
  <li>Added proper checking for QVariant type</li>
  <li>Changed to .conf naming for configs</li>
  <li>removed old test extension</li>
  <li>Moved extension handling to extension manager</li>
  <li>Added more extension identification functions</li>
  <li>Added some basic code standards guidance</li>
  <li>added missing settings import</li>
  <li>added basic setup.py</li>
  <li>added loaded config files to data directory</li>
  <li>added extension config removal</li>
  <li>Made extension configs live in one unified folder under data</li>
  <li>removed all logging of exceptions that are raised</li>
  <li>added cx_freeze build configurations</li>
  <li>added some style specifications</li>
  <li>removed empty file</li>
  <li>removed core and contrib extension differences</li>
  <li>added a load_all call in the client</li>
  <li>continued extensive overhaul of extension manager</li>
  <li>added tests for extension manager load_all fucntion</li>
  <li>making bundling exe's cleaner</li>
  <li>modified dependencies to allow bundling</li>
  <li>cleaned up code. No functional changes</li>
  <li>Made logging cleaner, and added a debug message.</li>
  <li>Cleaned up logging</li>
  <li>added an in-line-todo.</li>
  <li>added default extension directories</li>
  <li>changed load_all call to new load_core name</li>
  <li>added easy linux client cx_freeze compilation and creation</li>
  <li>fixed logger creation functions</li>
  <li>fixed some improper logging</li>
  <li>fixed variable creation order and added needed imports.</li>
  <li>added the last-ditch log location to gitignore.</li>
  <li>merged config handling into extension manager</li>
  <li>added build instructions for executable</li>
  <li>Created Zipped extension loader</li>
  <li>removed all current() and currentPath() calls.</li>
  <li>removed exe directory in favor of auto-built exe.<sys> dirs</li>
  <li>added a test runner to the project</li>
  <li>added temporary build and testing objects to gitignore</li>
  <li>updated the readme's</li>
  <li>added some missing module __init__ files</li>
  <li>added a mock extension object for testing.</li>
  <li>Made Extension Manager use zipped extensions</li>
  <li>Config properties no longer recursive.</li>
  <li>Removed mistyped filter</li>
  <li>fixed dependencies to make install_loaded work</li>
  <li>Added test for install loaded function</li>
  <li>added tests for getting an installed extension from a property.</li>
  <li>Made Readme valuable for this project</li>
  <li>updated extension manager installing and uninstalling.</li>
  <li>Replaced load_settings with simpler get_config</li>
  <li>updated the readme</li>
  <li>specified a clearer set of test ignores.</li>
  <li>Added built assets to mock dir for tests</li>
  <li>added more test functions and fixed code</li>
  <li>finished extension manager tests</li>
  <li>removed old config utility.</li>
  <li>added missing tests value to config checks</li>
  <li>fix translation and home directory creation errors</li>
  <li>Fixed pathing issues for changing dirs.</li>
  <li>Added loggging and changed a warning to a raise</li>
  <li>removed unneeded type assignment.</li>
  <li>re-connected the menu-bar to new extensions</li>
  <li>merged core and global paths</li>
  <li>Fixed extension  initialization  in client main</li>
  <li>Created a working mock extension</li>
  <li>Changed tests to reflect new global path</li>
  <li>removed assertions for bygone exceptions</li>
</ul>

<h4>File Changes</h4>
<ul>
  <li>
    <strong>M</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-0">.gitignore</a>
    (16)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-1">Makefile</a>
    (34)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-2">README.md</a>
    (194)
  </li>
  <li>
    <strong>D</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-3">TODO</a>
    (46)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-4">build/README.md</a>
    (89)
  </li>
  <li>
    <strong>R</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-5">build/scripts/build.py</a>
    (4)
  </li>
  <li>
    <strong>R</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-6">build/scripts/compile_ui.py</a>
    (7)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-7">build/scripts/zip_extensions.py</a>
    (103)
  </li>
  <li>
    <strong>R</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-8">commotion_client/GUI/__init__.py</a>
    (0)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-9">commotion_client/GUI/crash_report.py</a>
    (2)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-10">commotion_client/GUI/main_window.py</a>
    (161)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-11">commotion_client/GUI/menu_bar.py</a>
    (197)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-12">commotion_client/GUI/system_tray.py</a>
    (2)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-13">commotion_client/GUI/ui/__init__.py</a>
    (0)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-14">commotion_client/GUI/ui/welcome_page.ui</a>
    (53)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-15">commotion_client/GUI/welcome_page.py</a>
    (46)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-16">commotion_client/assets/stylesheets/forms.ss</a>
    (56)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-17">commotion_client/commotion_client.py</a>
    (199)
  </li>
  <li>
    <strong>D</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-18">commotion_client/data/extensions/test_ext001.conf</a>
    (8)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-19">commotion_client/extensions/__init__.py</a>
    (0)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-20">commotion_client/extensions/config_editor/__init__.py</a>
    (0)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-21">commotion_client/extensions/config_editor/config_editor.conf</a>
    (6)
  </li>
  <li>
    <strong>R</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-22">commotion_client/extensions/config_editor/main.py</a>
    (22)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-23">commotion_client/extensions/config_editor/test.py</a>
    (3)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-24">commotion_client/extensions/config_editor/ui/__init__.py</a>
    (0)
  </li>
  <li>
    <strong>R</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-25">commotion_client/extensions/config_editor/ui/config_manager.ui</a>
    (48)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-26">commotion_client/extensions/unit_test_mock/__init__.py</a>
    (0)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-27">commotion_client/extensions/unit_test_mock/main.py</a>
    (70)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-28">commotion_client/extensions/unit_test_mock/test.conf</a>
    (9)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-29">commotion_client/extensions/unit_test_mock/test.py</a>
    (5)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-30">commotion_client/extensions/unit_test_mock/test_bar.py</a>
    (43)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-31">commotion_client/extensions/unit_test_mock/ui/__init__.py</a>
    (0)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-32">commotion_client/extensions/unit_test_mock/ui/test.ui</a>
    (1928)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-33">commotion_client/extensions/unit_test_mock/units.py</a>
    (0)
  </li>
  <li>
    <strong>D</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-34">commotion_client/utils/config.py</a>
    (126)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-35">commotion_client/utils/extension_manager.py</a>
    (772)
  </li>
  <li>
    <strong>D</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-36">commotion_client/utils/fsUtils.py</a>
    (42)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-37">commotion_client/utils/fs_utils.py</a>
    (147)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-38">commotion_client/utils/logger.py</a>
    (208)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-39">commotion_client/utils/settings.py</a>
    (73)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-40">commotion_client/utils/validate.py</a>
    (342)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-41">docs/extensions/extension_template/main.py</a>
    (19)
  </li>
  <li>
    <strong>D</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-42">docs/extensions/tutorial/config_manager/config.json</a>
    (9)
  </li>
  <li>
    <strong>M</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-43">docs/extensions/writing_extensions.md</a>
    (26)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-44">docs/style_standards/README.md</a>
    (66)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-45">docs/style_standards/google_docstring_example.py</a>
    (223)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-46">setup.py</a>
    (88)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-47">tests/__init__.py</a>
    (0)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-48">tests/mock/extensions/unit_test_mock</a>
    (0)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-49">tests/run_tests.py</a>
    (32)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-50">tests/utils/__init__.py</a>
    (0)
  </li>
  <li>
    <strong>A</strong>
    <a href="https://github.com/opentechinstitute/commotion-client/pull/25/files#diff-51">tests/utils/extension_manager_tests.py</a>
    (559)
  </li>
</ul>

<h4>Patch Links:</h4>
<ul>
  <li><a href='https://github.com/opentechinstitute/commotion-client/pull/25.patch'>https://github.com/opentechinstitute/commotion-client/pull/25.patch</a></li>
  <li><a href='https://github.com/opentechinstitute/commotion-client/pull/25.diff'>https://github.com/opentechinstitute/commotion-client/pull/25.diff</a></li>
</ul>

<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">—<br>Reply to this email directly or <a href='https://github.com/opentechinstitute/commotion-client/pull/25'>view it on GitHub</a>.<img src='https://github.com/notifications/beacon/3074564__eyJzY29wZSI6Ik5ld3NpZXM6QmVhY29uIiwiZXhwaXJlcyI6MTcxMzI4ODgwNSwiZGF0YSI6eyJpZCI6MzAxNzM1NzB9fQ==--591698c461c58519382384cbcccdeddb46798817.gif' height='1' width='1'></p>