We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Better naming for scheduled jobs
In #459 identifiers for adhoc clusters and scheduled jobs were changed to be randomly generated. This is fine for a single-use cluster, but makes notifications for scheduled jobs meaningless. 

For example, I received a notification today that job "fervent-snyder-2799" has failed. It is owned by someone else, but emails are cc'd to telemetry-alerts as well (general audience to monitor for important failures).

I would prefer that the name for a scheduled job be reflective of what is being done in the job. 

Alternatively, we could ensure that the "description" field has been filled in and include that information in the notification emails.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `atmo/jobs/views.py`
Content:
```
1 # This Source Code Form is subject to the terms of the Mozilla Public
2 # License, v. 2.0. If a copy of the MPL was not distributed with this
3 # file, you can obtain one at http://mozilla.org/MPL/2.0/.
4 import logging
5 
6 from botocore.exceptions import ClientError
7 from django.conf import settings
8 from django.contrib.auth.decorators import login_required
9 from django.contrib import messages
10 from django.http import (HttpResponse, HttpResponseNotFound,
11                          StreamingHttpResponse)
12 from django.shortcuts import redirect, render, get_object_or_404
13 from django.template.response import TemplateResponse
14 from django.utils import timezone
15 from django.utils.safestring import mark_safe
16 from django.utils.text import get_valid_filename
17 
18 from .. import names
19 from ..clusters.models import EMRRelease
20 from ..decorators import (change_permission_required,
21                           delete_permission_required, modified_date,
22                           view_permission_required)
23 from ..models import next_field_value
24 from .forms import EditSparkJobForm, NewSparkJobForm, SparkJobAvailableForm
25 from .models import SparkJob
26 
27 logger = logging.getLogger("django")
28 
29 
30 @login_required
31 def check_identifier_available(request):
32     """
33     Given a Spark job identifier checks if one already exists.
34     """
35     form = SparkJobAvailableForm(request.GET)
36     if form.is_valid():
37         identifier = form.cleaned_data['identifier']
38         if SparkJob.objects.filter(identifier=identifier).exists():
39             response = HttpResponse('identifier unavailable')
40         else:
41             response = HttpResponseNotFound('identifier available')
42     else:
43         response = HttpResponseNotFound('identifier invalid')
44     return response
45 
46 
47 @login_required
48 def new_spark_job(request):
49     """
50     View to schedule a new Spark job to run on AWS EMR.
51     """
52     identifier = names.random_scientist()
53     next_identifier = next_field_value(SparkJob, 'identifier', identifier)
54     initial = {
55         'identifier': next_identifier,
56         'size': 1,
57         'interval_in_hours': SparkJob.INTERVAL_WEEKLY,
58         'job_timeout': 24,
59         'start_date': timezone.now(),
60         'emr_release': EMRRelease.objects.stable().first(),
61     }
62     form = NewSparkJobForm(request.user, initial=initial)
63     if request.method == 'POST':
64         form = NewSparkJobForm(
65             request.user,
66             data=request.POST,
67             files=request.FILES,
68             initial=initial,
69         )
70         if form.is_valid():
71             # this will also magically create the spark job for us
72             spark_job = form.save()
73             return redirect(spark_job)
74 
75     context = {
76         'form': form,
77     }
78     return render(request, 'atmo/jobs/new.html', context)
79 
80 
81 @login_required
82 @change_permission_required(SparkJob)
83 def edit_spark_job(request, id):
84     """
85     View to edit a scheduled Spark job that runs on AWS EMR.
86     """
87     spark_job = SparkJob.objects.get(pk=id)
88     form = EditSparkJobForm(request.user, instance=spark_job)
89     if request.method == 'POST':
90         form = EditSparkJobForm(
91             request.user,
92             data=request.POST,
93             files=request.FILES,
94             instance=spark_job,
95         )
96         if form.is_valid():
97             # this will also update the job for us
98             spark_job = form.save()
99             return redirect(spark_job)
100     context = {
101         'form': form,
102     }
103     return render(request, 'atmo/jobs/edit.html', context)
104 
105 
106 @login_required
107 @delete_permission_required(SparkJob)
108 def delete_spark_job(request, id):
109     """
110     View to delete a scheduled Spark job and then redirects to the dashboard.
111     """
112     spark_job = SparkJob.objects.get(pk=id)
113     if request.method == 'POST':
114         spark_job.delete()
115         return redirect('dashboard')
116     context = {
117         'spark_job': spark_job,
118     }
119     return render(request, 'atmo/jobs/delete.html', context=context)
120 
121 
122 @login_required
123 @view_permission_required(SparkJob)
124 @modified_date
125 def detail_spark_job(request, id):
126     """
127     View to show the details for the scheduled Spark job with the given ID.
128     """
129     spark_job = SparkJob.objects.get(pk=id)
130     context = {
131         'spark_job': spark_job,
132     }
133     if spark_job.latest_run:
134         context['modified_date'] = spark_job.latest_run.modified_at
135     return TemplateResponse(request, 'atmo/jobs/detail.html', context=context)
136 
137 
138 @login_required
139 @view_permission_required(SparkJob)
140 @modified_date
141 def detail_zeppelin_job(request, id):
142     """
143     View to show the details for the scheduled Zeppelin job with the given ID.
144     """
145     spark_job = get_object_or_404(SparkJob, pk=id)
146     response = ''
147     if spark_job.results:
148         markdown_url = ''.join([x for x in spark_job.results['data'] if x.endswith('md')])
149         bucket = settings.AWS_CONFIG['PUBLIC_DATA_BUCKET']
150         markdown_file = spark_job.provisioner.s3.get_object(Bucket=bucket,
151                                                             Key=markdown_url)
152         response = markdown_file['Body'].read().decode('utf-8')
153 
154     context = {
155         'markdown': response
156     }
157     return TemplateResponse(request, 'atmo/jobs/zeppelin_notebook.html', context=context)
158 
159 
160 @login_required
161 @view_permission_required(SparkJob)
162 def download_spark_job(request, id):
163     """
164     Download the notebook file for the scheduled Spark job with the given ID.
165     """
166     spark_job = SparkJob.objects.get(pk=id)
167     response = StreamingHttpResponse(
168         spark_job.notebook_s3_object['Body'].read().decode('utf-8'),
169         content_type='application/x-ipynb+json',
170     )
171     response['Content-Disposition'] = (
172         'attachment; filename=%s' %
173         get_valid_filename(spark_job.notebook_name)
174     )
175     response['Content-Length'] = spark_job.notebook_s3_object['ContentLength']
176     return response
177 
178 
179 @login_required
180 @view_permission_required(SparkJob)
181 def run_spark_job(request, id):
182     """
183     Run a scheduled Spark job right now, out of sync with its actual schedule.
184 
185     This will actively ask for confirmation to run the Spark job.
186     """
187     spark_job = SparkJob.objects.get(pk=id)
188     if not spark_job.is_runnable:
189         messages.error(
190             request,
191             mark_safe(
192                 '<h4>Run now unavailable.</h4>'
193                 "The Spark job can't be run manually at this time. Please try again later."
194             )
195         )
196         return redirect(spark_job)
197 
198     if request.method == 'POST':
199         if spark_job.latest_run:
200             try:
201                 spark_job.latest_run.sync()
202             except ClientError:
203                 messages.error(
204                     request,
205                     mark_safe(
206                         '<h4>Spark job API error</h4>'
207                         "The Spark job can't be run at the moment since there was a "
208                         "problem with fetching the status of the previous job run. "
209                         "Please try again later."
210                     )
211                 )
212                 return redirect(spark_job)
213 
214         spark_job.run()
215         latest_run = spark_job.get_latest_run()
216         if latest_run:
217             schedule_entry = spark_job.schedule.get()
218             schedule_entry.reschedule(
219                 last_run_at=spark_job.latest_run.scheduled_at,
220             )
221         return redirect(spark_job)
222 
223     context = {
224         'spark_job': spark_job,
225     }
226     return render(request, 'atmo/jobs/run.html', context=context)
227
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/atmo/jobs/views.py b/atmo/jobs/views.py
--- a/atmo/jobs/views.py
+++ b/atmo/jobs/views.py
@@ -14,12 +14,10 @@
 from django.utils.safestring import mark_safe
 from django.utils.text import get_valid_filename
 
-from .. import names
 from ..clusters.models import EMRRelease
 from ..decorators import (change_permission_required,
                           delete_permission_required, modified_date,
                           view_permission_required)
-from ..models import next_field_value
 from .forms import EditSparkJobForm, NewSparkJobForm, SparkJobAvailableForm
 from .models import SparkJob
 
@@ -48,10 +46,8 @@
     """
     View to schedule a new Spark job to run on AWS EMR.
     """
-    identifier = names.random_scientist()
-    next_identifier = next_field_value(SparkJob, 'identifier', identifier)
     initial = {
-        'identifier': next_identifier,
+        'identifier': '',
         'size': 1,
         'interval_in_hours': SparkJob.INTERVAL_WEEKLY,
         'job_timeout': 24,

{"golden_diff": "diff --git a/atmo/jobs/views.py b/atmo/jobs/views.py\n--- a/atmo/jobs/views.py\n+++ b/atmo/jobs/views.py\n@@ -14,12 +14,10 @@\n from django.utils.safestring import mark_safe\n from django.utils.text import get_valid_filename\n \n-from .. import names\n from ..clusters.models import EMRRelease\n from ..decorators import (change_permission_required,\n                           delete_permission_required, modified_date,\n                           view_permission_required)\n-from ..models import next_field_value\n from .forms import EditSparkJobForm, NewSparkJobForm, SparkJobAvailableForm\n from .models import SparkJob\n \n@@ -48,10 +46,8 @@\n     \"\"\"\n     View to schedule a new Spark job to run on AWS EMR.\n     \"\"\"\n-    identifier = names.random_scientist()\n-    next_identifier = next_field_value(SparkJob, 'identifier', identifier)\n     initial = {\n-        'identifier': next_identifier,\n+        'identifier': '',\n         'size': 1,\n         'interval_in_hours': SparkJob.INTERVAL_WEEKLY,\n         'job_timeout': 24,\n", "issue": "Better naming for scheduled jobs\nIn #459 identifiers for adhoc clusters and scheduled jobs were changed to be randomly generated. This is fine for a single-use cluster, but makes notifications for scheduled jobs meaningless. \r\n\r\nFor example, I received a notification today that job \"fervent-snyder-2799\" has failed. It is owned by someone else, but emails are cc'd to telemetry-alerts as well (general audience to monitor for important failures).\r\n\r\nI would prefer that the name for a scheduled job be reflective of what is being done in the job. \r\n\r\nAlternatively, we could ensure that the \"description\" field has been filled in and include that information in the notification emails.\n", "before_files": [{"content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, you can obtain one at http://mozilla.org/MPL/2.0/.\nimport logging\n\nfrom botocore.exceptions import ClientError\nfrom django.conf import settings\nfrom django.contrib.auth.decorators import login_required\nfrom django.contrib import messages\nfrom django.http import (HttpResponse, HttpResponseNotFound,\n                         StreamingHttpResponse)\nfrom django.shortcuts import redirect, render, get_object_or_404\nfrom django.template.response import TemplateResponse\nfrom django.utils import timezone\nfrom django.utils.safestring import mark_safe\nfrom django.utils.text import get_valid_filename\n\nfrom .. import names\nfrom ..clusters.models import EMRRelease\nfrom ..decorators import (change_permission_required,\n                          delete_permission_required, modified_date,\n                          view_permission_required)\nfrom ..models import next_field_value\nfrom .forms import EditSparkJobForm, NewSparkJobForm, SparkJobAvailableForm\nfrom .models import SparkJob\n\nlogger = logging.getLogger(\"django\")\n\n\n@login_required\ndef check_identifier_available(request):\n    \"\"\"\n    Given a Spark job identifier checks if one already exists.\n    \"\"\"\n    form = SparkJobAvailableForm(request.GET)\n    if form.is_valid():\n        identifier = form.cleaned_data['identifier']\n        if SparkJob.objects.filter(identifier=identifier).exists():\n            response = HttpResponse('identifier unavailable')\n        else:\n            response = HttpResponseNotFound('identifier available')\n    else:\n        response = HttpResponseNotFound('identifier invalid')\n    return response\n\n\n@login_required\ndef new_spark_job(request):\n    \"\"\"\n    View to schedule a new Spark job to run on AWS EMR.\n    \"\"\"\n    identifier = names.random_scientist()\n    next_identifier = next_field_value(SparkJob, 'identifier', identifier)\n    initial = {\n        'identifier': next_identifier,\n        'size': 1,\n        'interval_in_hours': SparkJob.INTERVAL_WEEKLY,\n        'job_timeout': 24,\n        'start_date': timezone.now(),\n        'emr_release': EMRRelease.objects.stable().first(),\n    }\n    form = NewSparkJobForm(request.user, initial=initial)\n    if request.method == 'POST':\n        form = NewSparkJobForm(\n            request.user,\n            data=request.POST,\n            files=request.FILES,\n            initial=initial,\n        )\n        if form.is_valid():\n            # this will also magically create the spark job for us\n            spark_job = form.save()\n            return redirect(spark_job)\n\n    context = {\n        'form': form,\n    }\n    return render(request, 'atmo/jobs/new.html', context)\n\n\n@login_required\n@change_permission_required(SparkJob)\ndef edit_spark_job(request, id):\n    \"\"\"\n    View to edit a scheduled Spark job that runs on AWS EMR.\n    \"\"\"\n    spark_job = SparkJob.objects.get(pk=id)\n    form = EditSparkJobForm(request.user, instance=spark_job)\n    if request.method == 'POST':\n        form = EditSparkJobForm(\n            request.user,\n            data=request.POST,\n            files=request.FILES,\n            instance=spark_job,\n        )\n        if form.is_valid():\n            # this will also update the job for us\n            spark_job = form.save()\n            return redirect(spark_job)\n    context = {\n        'form': form,\n    }\n    return render(request, 'atmo/jobs/edit.html', context)\n\n\n@login_required\n@delete_permission_required(SparkJob)\ndef delete_spark_job(request, id):\n    \"\"\"\n    View to delete a scheduled Spark job and then redirects to the dashboard.\n    \"\"\"\n    spark_job = SparkJob.objects.get(pk=id)\n    if request.method == 'POST':\n        spark_job.delete()\n        return redirect('dashboard')\n    context = {\n        'spark_job': spark_job,\n    }\n    return render(request, 'atmo/jobs/delete.html', context=context)\n\n\n@login_required\n@view_permission_required(SparkJob)\n@modified_date\ndef detail_spark_job(request, id):\n    \"\"\"\n    View to show the details for the scheduled Spark job with the given ID.\n    \"\"\"\n    spark_job = SparkJob.objects.get(pk=id)\n    context = {\n        'spark_job': spark_job,\n    }\n    if spark_job.latest_run:\n        context['modified_date'] = spark_job.latest_run.modified_at\n    return TemplateResponse(request, 'atmo/jobs/detail.html', context=context)\n\n\n@login_required\n@view_permission_required(SparkJob)\n@modified_date\ndef detail_zeppelin_job(request, id):\n    \"\"\"\n    View to show the details for the scheduled Zeppelin job with the given ID.\n    \"\"\"\n    spark_job = get_object_or_404(SparkJob, pk=id)\n    response = ''\n    if spark_job.results:\n        markdown_url = ''.join([x for x in spark_job.results['data'] if x.endswith('md')])\n        bucket = settings.AWS_CONFIG['PUBLIC_DATA_BUCKET']\n        markdown_file = spark_job.provisioner.s3.get_object(Bucket=bucket,\n                                                            Key=markdown_url)\n        response = markdown_file['Body'].read().decode('utf-8')\n\n    context = {\n        'markdown': response\n    }\n    return TemplateResponse(request, 'atmo/jobs/zeppelin_notebook.html', context=context)\n\n\n@login_required\n@view_permission_required(SparkJob)\ndef download_spark_job(request, id):\n    \"\"\"\n    Download the notebook file for the scheduled Spark job with the given ID.\n    \"\"\"\n    spark_job = SparkJob.objects.get(pk=id)\n    response = StreamingHttpResponse(\n        spark_job.notebook_s3_object['Body'].read().decode('utf-8'),\n        content_type='application/x-ipynb+json',\n    )\n    response['Content-Disposition'] = (\n        'attachment; filename=%s' %\n        get_valid_filename(spark_job.notebook_name)\n    )\n    response['Content-Length'] = spark_job.notebook_s3_object['ContentLength']\n    return response\n\n\n@login_required\n@view_permission_required(SparkJob)\ndef run_spark_job(request, id):\n    \"\"\"\n    Run a scheduled Spark job right now, out of sync with its actual schedule.\n\n    This will actively ask for confirmation to run the Spark job.\n    \"\"\"\n    spark_job = SparkJob.objects.get(pk=id)\n    if not spark_job.is_runnable:\n        messages.error(\n            request,\n            mark_safe(\n                '<h4>Run now unavailable.</h4>'\n                \"The Spark job can't be run manually at this time. Please try again later.\"\n            )\n        )\n        return redirect(spark_job)\n\n    if request.method == 'POST':\n        if spark_job.latest_run:\n            try:\n                spark_job.latest_run.sync()\n            except ClientError:\n                messages.error(\n                    request,\n                    mark_safe(\n                        '<h4>Spark job API error</h4>'\n                        \"The Spark job can't be run at the moment since there was a \"\n                        \"problem with fetching the status of the previous job run. \"\n                        \"Please try again later.\"\n                    )\n                )\n                return redirect(spark_job)\n\n        spark_job.run()\n        latest_run = spark_job.get_latest_run()\n        if latest_run:\n            schedule_entry = spark_job.schedule.get()\n            schedule_entry.reschedule(\n                last_run_at=spark_job.latest_run.scheduled_at,\n            )\n        return redirect(spark_job)\n\n    context = {\n        'spark_job': spark_job,\n    }\n    return render(request, 'atmo/jobs/run.html', context=context)\n", "path": "atmo/jobs/views.py"}], "after_files": [{"content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, you can obtain one at http://mozilla.org/MPL/2.0/.\nimport logging\n\nfrom botocore.exceptions import ClientError\nfrom django.contrib.auth.decorators import login_required\nfrom django.contrib import messages\nfrom django.http import (HttpResponse, HttpResponseNotFound,\n                         StreamingHttpResponse)\nfrom django.shortcuts import redirect, render\nfrom django.template.response import TemplateResponse\nfrom django.utils import timezone\nfrom django.utils.safestring import mark_safe\nfrom django.utils.text import get_valid_filename\n\nfrom ..clusters.models import EMRRelease\nfrom ..decorators import (change_permission_required,\n                          delete_permission_required, modified_date,\n                          view_permission_required)\nfrom .forms import EditSparkJobForm, NewSparkJobForm, SparkJobAvailableForm\nfrom .models import SparkJob\n\nlogger = logging.getLogger(\"django\")\n\n\n@login_required\ndef check_identifier_available(request):\n    \"\"\"\n    Given a Spark job identifier checks if one already exists.\n    \"\"\"\n    form = SparkJobAvailableForm(request.GET)\n    if form.is_valid():\n        identifier = form.cleaned_data['identifier']\n        if SparkJob.objects.filter(identifier=identifier).exists():\n            response = HttpResponse('identifier unavailable')\n        else:\n            response = HttpResponseNotFound('identifier available')\n    else:\n        response = HttpResponseNotFound('identifier invalid')\n    return response\n\n\n@login_required\ndef new_spark_job(request):\n    \"\"\"\n    View to schedule a new Spark job to run on AWS EMR.\n    \"\"\"\n    initial = {\n        'identifier': '',\n        'size': 1,\n        'interval_in_hours': SparkJob.INTERVAL_WEEKLY,\n        'job_timeout': 24,\n        'start_date': timezone.now(),\n        'emr_release': EMRRelease.objects.stable().first(),\n    }\n    form = NewSparkJobForm(request.user, initial=initial)\n    if request.method == 'POST':\n        form = NewSparkJobForm(\n            request.user,\n            data=request.POST,\n            files=request.FILES,\n            initial=initial,\n        )\n        if form.is_valid():\n            # this will also magically create the spark job for us\n            spark_job = form.save()\n            return redirect(spark_job)\n\n    context = {\n        'form': form,\n    }\n    return render(request, 'atmo/jobs/new.html', context)\n\n\n@login_required\n@change_permission_required(SparkJob)\ndef edit_spark_job(request, id):\n    \"\"\"\n    View to edit a scheduled Spark job that runs on AWS EMR.\n    \"\"\"\n    spark_job = SparkJob.objects.get(pk=id)\n    form = EditSparkJobForm(request.user, instance=spark_job)\n    if request.method == 'POST':\n        form = EditSparkJobForm(\n            request.user,\n            data=request.POST,\n            files=request.FILES,\n            instance=spark_job,\n        )\n        if form.is_valid():\n            # this will also update the job for us\n            spark_job = form.save()\n            return redirect(spark_job)\n    context = {\n        'form': form,\n    }\n    return render(request, 'atmo/jobs/edit.html', context)\n\n\n@login_required\n@delete_permission_required(SparkJob)\ndef delete_spark_job(request, id):\n    \"\"\"\n    View to delete a scheduled Spark job and then redirects to the dashboard.\n    \"\"\"\n    spark_job = SparkJob.objects.get(pk=id)\n    if request.method == 'POST':\n        spark_job.delete()\n        return redirect('dashboard')\n    context = {\n        'spark_job': spark_job,\n    }\n    return render(request, 'atmo/jobs/delete.html', context=context)\n\n\n@login_required\n@view_permission_required(SparkJob)\n@modified_date\ndef detail_spark_job(request, id):\n    \"\"\"\n    View to show the details for the scheduled Spark job with the given ID.\n    \"\"\"\n    spark_job = SparkJob.objects.get(pk=id)\n    context = {\n        'spark_job': spark_job,\n    }\n    if spark_job.latest_run:\n        context['modified_date'] = spark_job.latest_run.modified_at\n    return TemplateResponse(request, 'atmo/jobs/detail.html', context=context)\n\n\n@login_required\n@view_permission_required(SparkJob)\ndef download_spark_job(request, id):\n    \"\"\"\n    Download the notebook file for the scheduled Spark job with the given ID.\n    \"\"\"\n    spark_job = SparkJob.objects.get(pk=id)\n    response = StreamingHttpResponse(\n        spark_job.notebook_s3_object['Body'].read().decode('utf-8'),\n        content_type='application/x-ipynb+json',\n    )\n    response['Content-Disposition'] = (\n        'attachment; filename=%s' %\n        get_valid_filename(spark_job.notebook_name)\n    )\n    response['Content-Length'] = spark_job.notebook_s3_object['ContentLength']\n    return response\n\n\n@login_required\n@view_permission_required(SparkJob)\ndef run_spark_job(request, id):\n    \"\"\"\n    Run a scheduled Spark job right now, out of sync with its actual schedule.\n\n    This will actively ask for confirmation to run the Spark job.\n    \"\"\"\n    spark_job = SparkJob.objects.get(pk=id)\n    if not spark_job.is_runnable:\n        messages.error(\n            request,\n            mark_safe(\n                '<h4>Run now unavailable.</h4>'\n                \"The Spark job can't be run manually at this time. Please try again later.\"\n            )\n        )\n        return redirect(spark_job)\n\n    if request.method == 'POST':\n        if spark_job.latest_run:\n            try:\n                spark_job.latest_run.sync()\n            except ClientError:\n                messages.error(\n                    request,\n                    mark_safe(\n                        '<h4>Spark job API error</h4>'\n                        \"The Spark job can't be run at the moment since there was a \"\n                        \"problem with fetching the status of the previous job run. \"\n                        \"Please try again later.\"\n                    )\n                )\n                return redirect(spark_job)\n\n        spark_job.run()\n        latest_run = spark_job.get_latest_run()\n        if latest_run:\n            schedule_entry = spark_job.schedule.get()\n            schedule_entry.reschedule(\n                last_run_at=spark_job.latest_run.scheduled_at,\n            )\n        return redirect(spark_job)\n\n    context = {\n        'spark_job': spark_job,\n    }\n    return render(request, 'atmo/jobs/run.html', context=context)\n", "path": "atmo/jobs/views.py"}]}