Skip to content
Permalink
Browse files

✏ spelling update

  • Loading branch information...
Skraelingjar committed Apr 6, 2019
1 parent 7414336 commit 4e3ec713727339bf4034ef74be9f495f1917a90c
@@ -21,21 +21,21 @@ series: ["Portfolio Projects"]

A couple months ago I was approached by a friend and [designer](https://mikhailathornton.com/graphic) that asked if I was
interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information
with their customers, manage access to resources they have created and curated, while reducing the amount of work compared
with their customers, manage access to resources they have created and curated while reducing the amount of work compared
to using a traditional file-sharing service.

Given these requirements and a need to keep labor costs down, I chose to use a familiar framework, Django. The app would be
hosted on Heroku and use AWS services for the database and file storage. Because the app will not be used heavily and doesn't
Given these requirements and a need to keep labor costs down, I chose to use a familiar framework, Django. The app would
be hosted on Heroku and use AWS services for the database and file storage. Because the app will not be used heavily and doesn't
hold much state information outside of session variables, there is no need for replication or a shared cache. These options
allowed me to iterate quickly and efficiently.

### Client Side

Instead of taking the time to design a custom user interface, we decided to make small changes to [Dashkit](https://themes.getbootstrap.com/product/dashkit-admin-dashboard-template/), a Bootstrap-based dashboard template. All the changes were to match the styles of the
client's website.
Instead of taking the time to design a custom user interface, we decided to make small changes to [Dashkit](https://themes.getbootstrap.com/product/dashkit-admin-dashboard-template/),
a Bootstrap-based dashboard template. All the changes were to match the styles of the client's website.

I created custom authentication, profile, and error pages so that the client's customers won't have to
interact with any of the default Django admin pages (which were left unmodified).
I created custom authentication, profile, and error pages so that the client's customers won't have to interact with any
of the default Django admin pages (which were left unmodified).

I chose to forgo the use of any front-end JavaScript frameworks or libraries since the information doesn't change more than
once a day. This cut down on dev time and increase page load times.
@@ -48,13 +48,13 @@ Because of that requirement, the only advanced feature I used was a many-to-one
One of the more difficult areas of the project was extending Django's built-in user model and getting everything working correctly
in the admin panel. I ended up learning a lot about this process and it will be a breeze next time.

To keep things simple, the app is served by Gunicorn and static files by Whitenoise. I also used Sentry for errors, Timber
for logging, and SendGrid for any emails. These integrations were chosen for ease of setup and use.
To keep things simple, the app is served by Gunicorn and static files by Whitenoise. I also used Sentry for errors, Timber for
logging, and SendGrid for any emails. These integrations were chosen for ease of setup and use.

### Lessons Learned

The single biggest problem I had to solve was handling file uploads. Because the app was running on Heroku I didn't have a persistent
file system to use Django's built in media folder. I ended up finding a great library called django-s3direct that did the heavy lifting
file system to use Django's built-in media folder. I ended up finding a great library called django-s3direct that did the heavy lifting
for me. I spend a lot of time figuring out how to get the CORS headers working with my development environment.

Doing it again, I would have spent more time on the client side, picking a more minimalist CSS library and optimizing load times.
@@ -17,7 +17,7 @@
<pubDate>Fri, 15 Mar 2019 10:29:55 -0700</pubDate>

<guid>https://joshb.dev/portfolio/csc/</guid>
<description>A couple months ago I was approached by a friend and designer that asked if I was interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information with their customers, manage access to resources they have created and curated, while reducing the amount of work compared to using a traditional file-sharing service.
<description>A couple months ago I was approached by a friend and designer that asked if I was interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information with their customers, manage access to resources they have created and curated while reducing the amount of work compared to using a traditional file-sharing service.
Given these requirements and a need to keep labor costs down, I chose to use a familiar framework, Django.</description>
</item>

@@ -27,7 +27,7 @@
<pubDate>Fri, 15 Mar 2019 10:29:55 -0700</pubDate>

<guid>https://joshb.dev/portfolio/csc/</guid>
<description>A couple months ago I was approached by a friend and designer that asked if I was interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information with their customers, manage access to resources they have created and curated, while reducing the amount of work compared to using a traditional file-sharing service.
<description>A couple months ago I was approached by a friend and designer that asked if I was interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information with their customers, manage access to resources they have created and curated while reducing the amount of work compared to using a traditional file-sharing service.
Given these requirements and a need to keep labor costs down, I chose to use a familiar framework, Django.</description>
</item>

@@ -36,7 +36,7 @@
<pubDate>Fri, 15 Mar 2019 10:29:55 -0700</pubDate>

<guid>https://joshb.dev/portfolio/csc/</guid>
<description>A couple months ago I was approached by a friend and designer that asked if I was interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information with their customers, manage access to resources they have created and curated, while reducing the amount of work compared to using a traditional file-sharing service.
<description>A couple months ago I was approached by a friend and designer that asked if I was interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information with their customers, manage access to resources they have created and curated while reducing the amount of work compared to using a traditional file-sharing service.
Given these requirements and a need to keep labor costs down, I chose to use a familiar framework, Django.</description>
</item>

@@ -7,7 +7,7 @@
<meta name="author"
content="map[name:Josh Bowen]">
<meta name="description"
content="A couple months ago I was approached by a friend and designer that asked if I was interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information with their customers, manage access to resources they have created and curated, while reducing the amount of work compared to using a traditional file-sharing service.
content="A couple months ago I was approached by a friend and designer that asked if I was interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information with their customers, manage access to resources they have created and curated while reducing the amount of work compared to using a traditional file-sharing service.
Given these requirements and a need to keep labor costs down, I chose to use a familiar framework, Django." />
<meta name="keywords" content="homepage, blog, software, portfolio, development, programming" />
<meta name="robots" content="noodp" />
@@ -38,13 +38,13 @@
<link rel="shortcut icon" href="/favicon.ico">
<meta name="theme-color" content="#252627">
<meta itemprop="name" content="CoachSmart Consulting - Custom Web App">
<meta itemprop="description" content="A couple months ago I was approached by a friend and designer that asked if I was interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information with their customers, manage access to resources they have created and curated, while reducing the amount of work compared to using a traditional file-sharing service.
<meta itemprop="description" content="A couple months ago I was approached by a friend and designer that asked if I was interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information with their customers, manage access to resources they have created and curated while reducing the amount of work compared to using a traditional file-sharing service.
Given these requirements and a need to keep labor costs down, I chose to use a familiar framework, Django.">


<meta itemprop="datePublished" content="2019-03-15T10:29:55-07:00" />
<meta itemprop="dateModified" content="2019-03-15T10:29:55-07:00" />
<meta itemprop="wordCount" content="457">
<meta itemprop="dateModified" content="2019-04-06T13:48:47-07:00" />
<meta itemprop="wordCount" content="456">



@@ -53,7 +53,7 @@
<meta name="twitter:image" content="https://joshb.dev/"/>

<meta name="twitter:title" content="CoachSmart Consulting - Custom Web App"/>
<meta name="twitter:description" content="A couple months ago I was approached by a friend and designer that asked if I was interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information with their customers, manage access to resources they have created and curated, while reducing the amount of work compared to using a traditional file-sharing service.
<meta name="twitter:description" content="A couple months ago I was approached by a friend and designer that asked if I was interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information with their customers, manage access to resources they have created and curated while reducing the amount of work compared to using a traditional file-sharing service.
Given these requirements and a need to keep labor costs down, I chose to use a familiar framework, Django."/>


@@ -137,21 +137,21 @@ <h1 class="post-title"><a href="https://joshb.dev/portfolio/csc/">CoachSmart Con

<p>A couple months ago I was approached by a friend and <a href="https://mikhailathornton.com/graphic">designer</a> that asked if I was
interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information
with their customers, manage access to resources they have created and curated, while reducing the amount of work compared
with their customers, manage access to resources they have created and curated while reducing the amount of work compared
to using a traditional file-sharing service.</p>

<p>Given these requirements and a need to keep labor costs down, I chose to use a familiar framework, Django. The app would be
hosted on Heroku and use AWS services for the database and file storage. Because the app will not be used heavily and doesn&rsquo;t
<p>Given these requirements and a need to keep labor costs down, I chose to use a familiar framework, Django. The app would
be hosted on Heroku and use AWS services for the database and file storage. Because the app will not be used heavily and doesn&rsquo;t
hold much state information outside of session variables, there is no need for replication or a shared cache. These options
allowed me to iterate quickly and efficiently.</p>

<h3 id="client-side">Client Side</h3>

<p>Instead of taking the time to design a custom user interface, we decided to make small changes to <a href="https://themes.getbootstrap.com/product/dashkit-admin-dashboard-template/">Dashkit</a>, a Bootstrap-based dashboard template. All the changes were to match the styles of the
client&rsquo;s website.</p>
<p>Instead of taking the time to design a custom user interface, we decided to make small changes to <a href="https://themes.getbootstrap.com/product/dashkit-admin-dashboard-template/">Dashkit</a>,
a Bootstrap-based dashboard template. All the changes were to match the styles of the client&rsquo;s website.</p>

<p>I created custom authentication, profile, and error pages so that the client&rsquo;s customers won&rsquo;t have to
interact with any of the default Django admin pages (which were left unmodified).</p>
<p>I created custom authentication, profile, and error pages so that the client&rsquo;s customers won&rsquo;t have to interact with any
of the default Django admin pages (which were left unmodified).</p>

<p>I chose to forgo the use of any front-end JavaScript frameworks or libraries since the information doesn&rsquo;t change more than
once a day. This cut down on dev time and increase page load times.</p>
@@ -164,13 +164,13 @@ <h3 id="server-side">Server Side</h3>
<p>One of the more difficult areas of the project was extending Django&rsquo;s built-in user model and getting everything working correctly
in the admin panel. I ended up learning a lot about this process and it will be a breeze next time.</p>

<p>To keep things simple, the app is served by Gunicorn and static files by Whitenoise. I also used Sentry for errors, Timber
for logging, and SendGrid for any emails. These integrations were chosen for ease of setup and use.</p>
<p>To keep things simple, the app is served by Gunicorn and static files by Whitenoise. I also used Sentry for errors, Timber for
logging, and SendGrid for any emails. These integrations were chosen for ease of setup and use.</p>

<h3 id="lessons-learned">Lessons Learned</h3>

<p>The single biggest problem I had to solve was handling file uploads. Because the app was running on Heroku I didn&rsquo;t have a persistent
file system to use Django&rsquo;s built in media folder. I ended up finding a great library called django-s3direct that did the heavy lifting
file system to use Django&rsquo;s built-in media folder. I ended up finding a great library called django-s3direct that did the heavy lifting
for me. I spend a lot of time figuring out how to get the CORS headers working with my development environment.</p>

<p>Doing it again, I would have spent more time on the client side, picking a more minimalist CSS library and optimizing load times.</p>
@@ -187,9 +187,10 @@ <h3 id="lessons-learned">Lessons Learned</h3>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-tag meta-icon"><path d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z"></path><line x1="7" y1="7" x2="7" y2="7"></line></svg><span class="tag"><a href="https://joshb.dev/tags/django">django</a></span><span class="tag"><a href="https://joshb.dev/tags/python">python</a></span><span class="tag"><a href="https://joshb.dev/tags/postgres">postgres</a></span><span class="tag"><a href="https://joshb.dev/tags/redis">redis</a></span><span class="tag"><a href="https://joshb.dev/tags/development">development</a></span>
</p>

<p><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file-text"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg>457 Words</p>
<p><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file-text"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg>456 Words</p>


<p><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-git-commit"><circle cx="12" cy="12" r="4"></circle><line x1="1.05" y1="12" x2="7" y2="12"></line><line x1="17.01" y1="12" x2="22.96" y2="12"></line></svg><a href="https://github.com/Skraelingjar/web/commit/7414336c0107a5f3dfcda5ff4ed5cb1f6b97c813" target="_blank" rel="noopener">7414336</a> @ 2019-04-06</p>
</div>


@@ -17,7 +17,7 @@
<pubDate>Fri, 15 Mar 2019 10:29:55 -0700</pubDate>

<guid>https://joshb.dev/portfolio/csc/</guid>
<description>A couple months ago I was approached by a friend and designer that asked if I was interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information with their customers, manage access to resources they have created and curated, while reducing the amount of work compared to using a traditional file-sharing service.
<description>A couple months ago I was approached by a friend and designer that asked if I was interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information with their customers, manage access to resources they have created and curated while reducing the amount of work compared to using a traditional file-sharing service.
Given these requirements and a need to keep labor costs down, I chose to use a familiar framework, Django.</description>
</item>

@@ -17,7 +17,7 @@
<pubDate>Fri, 15 Mar 2019 10:29:55 -0700</pubDate>

<guid>https://joshb.dev/portfolio/csc/</guid>
<description>A couple months ago I was approached by a friend and designer that asked if I was interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information with their customers, manage access to resources they have created and curated, while reducing the amount of work compared to using a traditional file-sharing service.
<description>A couple months ago I was approached by a friend and designer that asked if I was interested in building a custom web app for a local coach/consultant. The client needed a secure way to share information with their customers, manage access to resources they have created and curated while reducing the amount of work compared to using a traditional file-sharing service.
Given these requirements and a need to keep labor costs down, I chose to use a familiar framework, Django.</description>
</item>

Oops, something went wrong.

0 comments on commit 4e3ec71

Please sign in to comment.
You can’t perform that action at this time.