diff --git a/.circleci/config.yml b/.circleci/config.yml index 7fd9226..dd1707a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,7 +6,7 @@ jobs: steps: - checkout - run: | - curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o ~/docker-compose + curl -L https://github.com/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` -o ~/docker-compose chmod +x ~/docker-compose sudo mv ~/docker-compose /usr/local/bin/docker-compose - run: | diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..a2dbd11 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: 'bug' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser: [e.g. chrome, safari] + - Version: [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser: [e.g. stock browser, safari] + - Version: [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..36014cd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: 'enhancement' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..749d24a --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,9 @@ +# Pull Request + +Thank you for contributing to `job-history`. + +**What does your Pull Request seek to accomplish?** + +**Please list any related issues, using [closing keywords](https://docs.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword) if appropriate** + +Thanks again! diff --git a/README.md b/README.md index 1b8398f..4788d55 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # job-history +[![stephengtuggy](https://circleci.com/gh/stephengtuggy/job-history.svg?style=shield)](https://circleci.com/gh/stephengtuggy/job-history) + ## Overview This is a web app that lets you enter info about your current and past jobs into a database. You can then view this info later on, when you need to fill out a job application. This way, you won't have to remember everything every time. And you can refine the wording on, for example, your "Contributions and Accomplishments" section over time. @@ -8,7 +10,7 @@ This is a web app that lets you enter info about your current and past jobs into This app runs in `Docker`. You will need both Docker and Docker Compose to build and run it. On macOS and Windows, the easiest way to get these products is to download and install Docker Desktop Community Edition. -Also, you will need a copy of a file called `.env`. Ask me for this file, and I can send you one, via a more secure channel than GitHub. Place this file in the `app` folder just off the root of your local working copy of this repo. +Also, you will need a copy of a file called `.env`. Ask me for this file, and I can send you one, via a more secure channel than GitHub. Place this file in the root folder of your local working copy of this repo. Once you have these items in place, run the command `docker-compose up --build`, either in PowerShell on Windows, or in Terminal on macOS or Linux. You should see Docker Compose pulling the latest copy of each source docker image, then building the main image for this app, and finally, spinning up both containers. @@ -24,7 +26,7 @@ After the createsuperuser command, follow the prompts to set up your first user ## Use -Now comes the fun part. Under `JOB HISTORY`, click on `EMPLOYERS`, and enter your employers, one at a time. (Employers that you have worked for in the past ten years is probably sufficient.) +Now, down to business. Under `JOB HISTORY`, click on `EMPLOYERS`, and enter your employers, one at a time. (Employers that you have worked for in the past ten years is probably sufficient.) Finally, click on the `JOB HISTORY` breadcrumb; click on `POSITIONS`; and start entering the positions you have held at each employer, along with the time periods for each. diff --git a/app/Dockerfile b/app/Dockerfile index c5a979b..cfd8e42 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -1,14 +1,20 @@ FROM python:3.7-buster +ENV PYTHONDONTWRITEBYTECODE 1 +ENV PYTHONUNBUFFERED 1 + WORKDIR /usr/src/app RUN apt-get -y update +RUN apt-get -y upgrade # Netcat is used by tcp-port-wait.sh RUN apt-get -y install netcat postgresql-client libgdal-dev -RUN apt-get -y dist-upgrade +RUN python -m pip install --upgrade --upgrade-strategy eager pip + +RUN mkdir -p /usr/src/app COPY ./requirements.txt /usr/src/app -RUN pip install -r ./requirements.txt +RUN python -m pip install --upgrade --upgrade-strategy eager --use-feature=2020-resolver -r ./requirements.txt COPY . /usr/src/app diff --git a/app/jobHistory/admin.py b/app/jobHistory/admin.py index 16d256a..bd88c1b 100644 --- a/app/jobHistory/admin.py +++ b/app/jobHistory/admin.py @@ -8,6 +8,7 @@ class JobTimePeriodInline(admin.TabularInline): class PositionAdmin(admin.ModelAdmin): + model = Position inlines = [JobTimePeriodInline] diff --git a/app/jobHistory/migrations/0005_auto_20200808_2225.py b/app/jobHistory/migrations/0005_auto_20200808_2225.py new file mode 100644 index 0000000..5bf7085 --- /dev/null +++ b/app/jobHistory/migrations/0005_auto_20200808_2225.py @@ -0,0 +1,33 @@ +# Generated by Django 2.2.15 on 2020-08-08 22:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('jobHistory', '0004_auto_20190804_1411'), + ] + + operations = [ + migrations.AddConstraint( + model_name='jobtimeperiod', + constraint=models.CheckConstraint(check=models.Q(('is_current_position__exact', True), ('end_year__isnull', False), _connector='OR'), name='require_end_date_if_not_current_position'), + ), + migrations.AddConstraint( + model_name='jobtimeperiod', + constraint=models.CheckConstraint(check=models.Q(('is_current_position__exact', False), models.Q(('end_year__isnull', True), ('end_month__isnull', True), ('end_day__isnull', True)), _connector='OR'), name='leave_end_date_blank_if_current_position'), + ), + migrations.AddConstraint( + model_name='jobtimeperiod', + constraint=models.CheckConstraint(check=models.Q(('start_month__isnull', False), ('start_day__isnull', True), _connector='OR'), name='require_start_month_if_start_day_specified'), + ), + migrations.AddConstraint( + model_name='jobtimeperiod', + constraint=models.CheckConstraint(check=models.Q(('end_year__isnull', False), models.Q(('end_month__isnull', True), ('end_day__isnull', True)), _connector='OR'), name='require_end_year_if_end_month_specified'), + ), + migrations.AddConstraint( + model_name='jobtimeperiod', + constraint=models.CheckConstraint(check=models.Q(('end_month__isnull', False), ('end_day__isnull', True), _connector='OR'), name='require_end_month_if_end_day_specified'), + ), + ] diff --git a/app/jobHistory/migrations/0006_auto_20200808_2342.py b/app/jobHistory/migrations/0006_auto_20200808_2342.py new file mode 100644 index 0000000..2e3d444 --- /dev/null +++ b/app/jobHistory/migrations/0006_auto_20200808_2342.py @@ -0,0 +1,43 @@ +# Generated by Django 2.2.15 on 2020-08-08 23:42 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('jobHistory', '0005_auto_20200808_2225'), + ] + + operations = [ + migrations.AlterField( + model_name='jobtimeperiod', + name='end_day', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='End Day'), + ), + migrations.AlterField( + model_name='jobtimeperiod', + name='end_month', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='End Month'), + ), + migrations.AlterField( + model_name='jobtimeperiod', + name='end_year', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='End Year'), + ), + migrations.AlterField( + model_name='jobtimeperiod', + name='hours_per_week', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='Hours per Week'), + ), + migrations.AlterField( + model_name='jobtimeperiod', + name='start_day', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='Start Day'), + ), + migrations.AlterField( + model_name='jobtimeperiod', + name='start_month', + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='Start Month'), + ), + ] diff --git a/app/jobHistory/migrations/0007_auto_20200813_1931.py b/app/jobHistory/migrations/0007_auto_20200813_1931.py new file mode 100644 index 0000000..0e61e38 --- /dev/null +++ b/app/jobHistory/migrations/0007_auto_20200813_1931.py @@ -0,0 +1,34 @@ +# Generated by Django 2.2.15 on 2020-08-13 19:31 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('jobHistory', '0006_auto_20200808_2342'), + ] + + operations = [ + migrations.AlterField( + model_name='jobtimeperiod', + name='end_day', + field=models.PositiveSmallIntegerField(blank=True, null=True, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(31)], verbose_name='End Day'), + ), + migrations.AlterField( + model_name='jobtimeperiod', + name='end_month', + field=models.PositiveSmallIntegerField(blank=True, null=True, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(12)], verbose_name='End Month'), + ), + migrations.AlterField( + model_name='jobtimeperiod', + name='start_day', + field=models.PositiveSmallIntegerField(blank=True, null=True, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(31)], verbose_name='Start Day'), + ), + migrations.AlterField( + model_name='jobtimeperiod', + name='start_month', + field=models.PositiveSmallIntegerField(blank=True, null=True, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(12)], verbose_name='Start Month'), + ), + ] diff --git a/app/jobHistory/models.py b/app/jobHistory/models.py index d34fd4c..aff0539 100644 --- a/app/jobHistory/models.py +++ b/app/jobHistory/models.py @@ -1,5 +1,7 @@ import datetime +from django.core.exceptions import ValidationError +from django.core.validators import MinValueValidator, MaxValueValidator from django.db import models from django.utils.translation import gettext_lazy as _ @@ -49,7 +51,7 @@ class Meta: supervisor_state_or_province = models.CharField(max_length=200, blank=True, null=False, verbose_name=_('Supervisor State or Province')) supervisor_zip_or_postal_code = models.CharField(max_length=50, blank=True, null=False, verbose_name=_('Supervisor Zip Code or Postal Code')) supervisor_country = models.CharField(max_length=200, blank=True, null=False, verbose_name=_('Supervisor Country')) - can_contact = models.BooleanField(null=False, verbose_name=_('Can Contact?')) + can_contact = models.BooleanField(blank=False, null=False, verbose_name=_('Can Contact?')) def __str__(self): return self.title + " @ " + str(self.employer) @@ -58,18 +60,25 @@ def __str__(self): class JobTimePeriod(models.Model): class Meta: verbose_name = _('Job Time Period') + constraints = [ + models.CheckConstraint(check=(models.Q(is_current_position__exact=True) | models.Q(end_year__isnull=False)), name='require_end_date_if_not_current_position'), + models.CheckConstraint(check=(models.Q(is_current_position__exact=False) | (models.Q(end_year__isnull=True) & models.Q(end_month__isnull=True) & models.Q(end_day__isnull=True))), name='leave_end_date_blank_if_current_position'), + models.CheckConstraint(check=(models.Q(start_month__isnull=False) | models.Q(start_day__isnull=True)), name='require_start_month_if_start_day_specified'), + models.CheckConstraint(check=(models.Q(end_year__isnull=False) | (models.Q(end_month__isnull=True) & models.Q(end_day__isnull=True))), name='require_end_year_if_end_month_specified'), + models.CheckConstraint(check=(models.Q(end_month__isnull=False) | models.Q(end_day__isnull=True)), name='require_end_month_if_end_day_specified') + ] position = models.ForeignKey(Position, on_delete=models.CASCADE, verbose_name=_('Position')) - start_year = models.PositiveIntegerField(null=False, verbose_name=_('Start Year')) - start_month = models.PositiveSmallIntegerField(null=True, verbose_name=_('Start Month')) - start_day = models.PositiveSmallIntegerField(null=True, verbose_name=_('Start Day')) - is_current_position = models.BooleanField(null=False, default=True, verbose_name=_('Current Position?')) - end_year = models.PositiveIntegerField(null=True, verbose_name=_('End Year')) - end_month = models.PositiveSmallIntegerField(null=True, verbose_name=_('End Month')) - end_day = models.PositiveSmallIntegerField(null=True, verbose_name=_('End Day')) + start_year = models.PositiveIntegerField(blank=False, null=False, verbose_name=_('Start Year')) + start_month = models.PositiveSmallIntegerField(blank=True, null=True, validators=[MinValueValidator(1), MaxValueValidator(12)], verbose_name=_('Start Month')) + start_day = models.PositiveSmallIntegerField(blank=True, null=True, validators=[MinValueValidator(1), MaxValueValidator(31)], verbose_name=_('Start Day')) + is_current_position = models.BooleanField(blank=False, null=False, default=True, verbose_name=_('Current Position?')) + end_year = models.PositiveIntegerField(blank=True, null=True, verbose_name=_('End Year')) + end_month = models.PositiveSmallIntegerField(blank=True, null=True, validators=[MinValueValidator(1), MaxValueValidator(12)], verbose_name=_('End Month')) + end_day = models.PositiveSmallIntegerField(blank=True, null=True, validators=[MinValueValidator(1), MaxValueValidator(31)], verbose_name=_('End Day')) starting_pay = models.CharField(max_length=50, blank=False, null=False, verbose_name=_('Starting Pay')) ending_pay = models.CharField(max_length=50, blank=False, null=False, verbose_name=_('Ending Pay')) - hours_per_week = models.PositiveSmallIntegerField(null=True, verbose_name=_('Hours per Week')) + hours_per_week = models.PositiveSmallIntegerField(blank=True, null=True, verbose_name=_('Hours per Week')) contributions_and_accomplishments = models.TextField(blank=True, null=False, verbose_name=_('Contributions and Accomplishments')) work_city = models.CharField(max_length=200, blank=True, null=False, verbose_name=_('Work City')) work_county_or_parish = models.CharField(max_length=200, blank=True, null=False, verbose_name=_('Work County or Parish')) @@ -79,22 +88,40 @@ class Meta: @property def startDate(self): - return datetime.date(self.start_year, self.start_month, self.start_day) + return datetime.date(self.start_year, self.start_month or 1, self.start_day or 1) @property def endDate(self): if self.is_current_position: return datetime.date.today() else: - return datetime.date(self.end_year, self.end_month, self.end_day) + return datetime.date(self.end_year or datetime.MINYEAR, self.end_month or 1, self.end_day or 1) def __str__(self): ret_val = str(self.position) ret_val += " from " - ret_val += str(self.startDate) + try: + ret_val += str(self.startDate) + except ValueError as e: + ret_val += '' ret_val += " to " if self.is_current_position: ret_val += "present" else: - ret_val += str(self.endDate) + try: + ret_val += str(self.endDate) + except ValueError as e: + ret_val += '' return ret_val + + def clean(self): + if self.is_current_position and self.end_year is not None: + raise ValidationError(_('Leave end date blank if this is your current position')) + elif self.end_year is None and not self.is_current_position: + raise ValidationError(_('End date (at least end year) is required if this is not your current position')) + elif self.start_month is None and self.start_day is not None: + raise ValidationError(_('Start month is required if start day is specified')) + elif self.end_year is None and (self.end_month is not None or self.end_day is not None): + raise ValidationError(_('End year is required if end month or end day is specified')) + elif self.end_month is None and self.end_day is not None: + raise ValidationError(_('End month is required if end day is specified')) diff --git a/app/jobHistory/static/css/jobHistory.css b/app/jobHistory/static/css/jobHistory.css new file mode 100644 index 0000000..815c186 --- /dev/null +++ b/app/jobHistory/static/css/jobHistory.css @@ -0,0 +1,7 @@ +body { + background-color: rgb(240, 248, 255); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} diff --git a/app/jobHistory/urls.py b/app/jobHistory/urls.py index 8788c15..f7c3a95 100644 --- a/app/jobHistory/urls.py +++ b/app/jobHistory/urls.py @@ -1,8 +1,9 @@ from django.urls import path -from .views import IndexView +from .views import IndexView, JobTimePeriodDetailView app_name = 'jobHistory' urlpatterns = [ path('', IndexView.as_view(), name='index'), + path('/', JobTimePeriodDetailView.as_view(), name='job-time-period-detail'), ] diff --git a/app/jobHistory/views.py b/app/jobHistory/views.py index 28ab2c2..ca7a4b8 100644 --- a/app/jobHistory/views.py +++ b/app/jobHistory/views.py @@ -2,15 +2,22 @@ from django.contrib.auth.mixins import LoginRequiredMixin from django.shortcuts import render -from django.views import generic +from django.views.generic.list import ListView +from django.views.generic.detail import DetailView #, SingleObjectTemplateResponseMixin from .models import JobTimePeriod -# Create your views here. -class IndexView(LoginRequiredMixin, generic.ListView): + +class IndexView(LoginRequiredMixin, ListView): template_name = 'jobHistory/index.html' context_object_name = 'chronological_job_list' def get_queryset(self): job_time_periods = JobTimePeriod.objects.all() return sorted(job_time_periods, key=operator.attrgetter('endDate'), reverse=True) + + +class JobTimePeriodDetailView(LoginRequiredMixin, DetailView): + model = JobTimePeriod + + diff --git a/app/jobHistorySite/settings.py b/app/jobHistorySite/settings.py index a5dba48..a890180 100644 --- a/app/jobHistorySite/settings.py +++ b/app/jobHistorySite/settings.py @@ -4,10 +4,10 @@ Generated by 'django-admin startproject' using Django 2.1.4. For more information on this file, see -https://docs.djangoproject.com/en/2.1/topics/settings/ +https://docs.djangoproject.com/en/2.2/topics/settings/ For the full list of settings and their values, see -https://docs.djangoproject.com/en/2.1/ref/settings/ +https://docs.djangoproject.com/en/2.2/ref/settings/ """ import os @@ -33,7 +33,7 @@ # Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ +# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = env('JOB_HISTORY_SECRET_KEY') @@ -93,7 +93,7 @@ # Database -# https://docs.djangoproject.com/en/2.1/ref/settings/#databases +# https://docs.djangoproject.com/en/2.2/ref/settings/#databases DATABASES = { 'default': { @@ -108,7 +108,7 @@ # Password validation -# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators +# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { @@ -127,7 +127,7 @@ # Internationalization -# https://docs.djangoproject.com/en/2.1/topics/i18n/ +# https://docs.djangoproject.com/en/2.2/topics/i18n/ LANGUAGE_CODE = 'en-us' @@ -141,10 +141,11 @@ # Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/2.1/howto/static-files/ +# https://docs.djangoproject.com/en/2.2/howto/static-files/ STATICFILES_STORAGE='whitenoise.storage.CompressedManifestStaticFilesStorage' STATIC_URL = env('JOB_HISTORY_STATIC_URL') STATIC_ROOT = env('JOB_HISTORY_STATIC_ROOT') LOGIN_URL = reverse_lazy('login') +LOGIN_REDIRECT_URL = reverse_lazy('jobHistory:index') diff --git a/app/requirements.txt b/app/requirements.txt index 702746f..b570bd5 100644 --- a/app/requirements.txt +++ b/app/requirements.txt @@ -1,17 +1,16 @@ -Django>=2.2.4,<2.3 -django-environ>=0.4.5,<0.5 -psycopg2-binary>=2.8.3,<2.9 -GDAL>=2.3.0,<2.4 -whitenoise>=4.1.2,<4.2 - -astroid>=2.2.5,<2.3 -colorama>=0.4.1,<0.5 -isort>=4.3.21,<4.4 -lazy-object-proxy>=1.4.1,<1.5 -mccabe>=0.6.1,<0.7 -pylint>=2.3.1,<2.4 -pytz>=2019.2,<2019.3 -six>=1.12.0,<1.13 -sqlparse>=0.3.0,<0.4 -typed-ast>=1.4.0,<1.5 -wrapt>=1.11.2,<1.12 +astroid==2.4.2 +colorama==0.4.3 +Django==2.2.15 +django-environ==0.4.5 +GDAL==2.4.0 +isort==4.3.21 +lazy-object-proxy==1.4.3 +mccabe==0.6.1 +psycopg2-binary==2.8.5 +pylint==2.5.3 +pytz==2020.1 +six==1.15.0 +sqlparse==0.3.1 +typed-ast==1.4.1 +whitenoise==5.2.0 +wrapt==1.12.1 diff --git a/app/templates/base/base.html b/app/templates/base/base.html index b42c2df..9a42ae7 100644 --- a/app/templates/base/base.html +++ b/app/templates/base/base.html @@ -1,15 +1,19 @@ +{% load static %} {% block title %}{% endblock %} +
- {% if user.is_authenticated %} -

Welcome, {{ user.username }}. Enter data. View job history. Log out.

- {% else %} -

Please log in.

- {% endif %} +
{% block content %} diff --git a/app/templates/jobHistory/index.html b/app/templates/jobHistory/index.html index 925fb56..908bab1 100644 --- a/app/templates/jobHistory/index.html +++ b/app/templates/jobHistory/index.html @@ -3,7 +3,21 @@ {% block title %}Your Job History{% endblock %} {% block content %} - {% for job_time_period in chronological_job_list %} -

{{ job_time_period }}

- {% endfor %} +

Your Job History

+ + + + + + {% for job_time_period in chronological_job_list %} + + + + + + + + {% endfor %} + +
TitleEmployerFromToDetails
{{ job_time_period.position.title }}{{ job_time_period.position.employer.long_name }}{{ job_time_period.startDate }}{{ job_time_period.endDate }}More...
{% endblock %} diff --git a/app/templates/jobHistory/jobtimeperiod_detail.html b/app/templates/jobHistory/jobtimeperiod_detail.html new file mode 100644 index 0000000..a7dfd05 --- /dev/null +++ b/app/templates/jobHistory/jobtimeperiod_detail.html @@ -0,0 +1,60 @@ +{% extends "base/base.html" %} + +{% block title %}Detail - {{ object }}{% endblock %} + +{% block content %} +
+

{{ object }}

+

Title: {{ object.position.title }}

+

Employer: {{ object.position.employer.long_name }}

+

Current Position? {{ object.current_position|yesno }}

+

Start Year: {{ object.start_year }}

+

Start Month: {{ object.start_month }}

+

Start Day: {{ object.start_day }}

+

End Year: {{ object.end_year }}

+

End Month: {{ object.end_month }}

+

End Day: {{ object.end_day }}

+

Position Responsibilities:
+ {{ object.position.responsibilities|linebreaksbr }}

+

Contributions and Accomplishments in Position:
+ {{ object.position.contributions_and_accomplishments|linebreaksbr }}

+

Contributions and Accomplishments During This Specific Time Period:
+ {{ object.contributions_and_accomplishments|linebreaksbr }}

+

City Worked In: {{ object.work_city }}

+

County/Parish: {{ object.work_county_or_parish }}

+

State/Province: {{ object.work_state_or_province }}

+

Zip/Postal Code: {{ object.work_zip_or_postal_code }}

+

Country: {{ object.work_country }}

+

Hours Per Week: {{ object.hours_per_week }}

+

Starting Pay: {{ object.starting_pay }}

+

Ending Pay: {{ object.ending_pay }}

+

 

+
+

Supervisor

+
+

Supervisor Name

+

Prefix: {{ object.position.supervisor_name_prefix }}

+

First/Given Name: {{ object.position.supervisor_given_name }}

+

Middle: {{ object.position.supervisor_middle_name }}

+

Last Name/Surname: {{ object.position.supervisor_surname }}

+

Suffix: {{ object.position.supervisor_name_suffix }}

+
+

 

+

Phone: {{ object.position.supervisor_phone }}

+

Email: {{ object.position.supervisor_email }}

+
+

Supervisor Address

+

Address Line 1: {{ object.position.supervisor_addr1 }}

+

Address Line 2: {{ object.position.supervisor_addr2 }}

+

Address Line 3: {{ object.position.supervisor_addr3 }}

+

City: {{ object.position.supervisor_city }}

+

County/Parish: {{ object.position.supervisor_county_or_parish }}

+

State/Province: {{ object.position.supervisor_state_or_province }}

+

Zip/Postal Code: {{ object.position.supervisor_zip_or_postal_code }}

+

Country: {{ object.position.supervisor_country }}

+
+

 

+

Can Contact? {{ object.position.can_contact|yesno }}

+
+
+{% endblock %} diff --git a/docker-compose.yml b/docker-compose.yml index e600dca..3ce7090 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,6 +14,7 @@ services: - "8000:8000" networks: - job_history_net_1 + - job_history_internal_net restart: "no" db: @@ -28,12 +29,14 @@ services: ports: - "5432:5432" networks: - - job_history_net_1 + - job_history_internal_net restart: "no" networks: job_history_net_1: + job_history_internal_net: + internal: true volumes: pg_data: