prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Source create page layout could be improved
  At `source-create/`, the form is not taking up all the horizontal space. This should be an easy fix by changing the column width in Bootstrap. 
  It would be better if we keep the same layout as the old Cantus. For example, the first three fields should be on the same row. This will make the form look more compact. 
  Plus, the width of the fields should be adjusted according to the expected content. For example, the `summary` field should be wider than "date". 
  The look is not the most important thing, but in this case, a little bit more polishing can go a long way. 
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `django/cantusdb_project/main_app/models/source.py`
  Content:
  ```
  1 from django.db import models
  2 from main_app.models import BaseModel
  3 from django.contrib.auth import get_user_model
  4 
  5 
  6 class Source(BaseModel):
  7     cursus_choices = [("Monastic", "Monastic"), ("Secular", "Secular")]
  8     source_status_choices = [
  9         (
  10             "Editing process (not all the fields have been proofread)",
  11             "Editing process (not all the fields have been proofread)",
  12         ),
  13         ("Published / Complete", "Published / Complete"),
  14         ("Published / Proofread pending", "Published / Proofread pending"),
  15         ("Unpublished / Editing process", "Unpublished / Editing process"),
  16         ("Unpublished / Indexing process", "Unpublished / Indexing process"),
  17         ("Unpublished / Proofread pending", "Unpublished / Proofread pending"),
  18         ("Unpublished / Proofreading process", "Unpublished / Proofreading process"),
  19     ]
  20 
  21     # sources with public=False cannot be accessed by its url (access denied) and do not appear in source list
  22     public = models.BooleanField(blank=True, null=True)
  23     # sources with visible=False can be accessed by typing in the url, but do not appear in source list
  24     visible = models.BooleanField(blank=True, null=True)
  25     title = models.CharField(
  26         max_length=255,
  27         help_text="Full Manuscript Identification (City, Archive, Shelf-mark)",
  28     )
  29     # the siglum field as implemented on the old Cantus is composed of both the RISM siglum and the shelfmark
  30     # it is a human-readable ID for a source
  31     siglum = models.CharField(max_length=63, null=True, blank=True)
  32     # the RISM siglum uniquely identifies a library or holding institution
  33     rism_siglum = models.ForeignKey(
  34         "RismSiglum", on_delete=models.PROTECT, null=True, blank=True,
  35     )
  36     provenance = models.ForeignKey(
  37         "Provenance",
  38         on_delete=models.PROTECT,
  39         help_text="If the origin is unknown, select a location where the source was "
  40         "used later in its lifetime and provide details in the "
  41         '"Provenance notes" field.',
  42         null=True,
  43         blank=True,
  44     )
  45     provenance_notes = models.TextField(
  46         blank=True,
  47         null=True,
  48         help_text="More exact indication of the provenance (if necessary)",
  49     )
  50     full_source = models.BooleanField(blank=True, null=True)
  51     date = models.CharField(
  52         blank=True,
  53         null=True,
  54         max_length=63,
  55         help_text='Date of the manuscript (e.g. "1200s", "1300-1350", etc.)',
  56     )
  57     century = models.ManyToManyField("Century", related_name="sources")
  58     notation = models.ManyToManyField("Notation", related_name="sources")
  59     cursus = models.CharField(
  60         blank=True, null=True, choices=cursus_choices, max_length=63
  61     )
  62     # TODO: Fill this field up with JSON info when I have access to the Users
  63     current_editors = models.ManyToManyField(get_user_model(), related_name="sources_edited")
  64     inventoried_by = models.ManyToManyField(
  65         "Indexer", related_name="sources_inventoried"
  66     )
  67     full_text_entered_by = models.ManyToManyField(
  68         "Indexer", related_name="entered_full_text_for_sources"
  69     )
  70     melodies_entered_by = models.ManyToManyField(
  71         "Indexer", related_name="entered_melody_for_sources"
  72     )
  73     proofreaders = models.ManyToManyField("Indexer", related_name="proofread_sources")
  74     other_editors = models.ManyToManyField("Indexer", related_name="edited_sources")
  75     segment = models.ForeignKey(
  76         "Segment", on_delete=models.PROTECT, blank=True, null=True
  77     )
  78     source_status = models.CharField(blank=True, null=True, max_length=255)
  79     complete_inventory = models.BooleanField(blank=True, null=True)
  80     summary = models.TextField(blank=True, null=True)
  81     liturgical_occasions = models.TextField(blank=True, null=True)
  82     description = models.TextField(blank=True, null=True)
  83     selected_bibliography = models.TextField(blank=True, null=True)
  84     image_link = models.URLField(blank=True, null=True)
  85     indexing_notes = models.TextField(blank=True, null=True)
  86     indexing_date = models.TextField(blank=True, null=True)
  87     json_info = models.JSONField(blank=True, null=True)
  88     fragmentarium_id = models.CharField(max_length=15, blank=True, null=True)
  89     dact_id = models.CharField(max_length=15, blank=True, null=True)
  90 
  91     def number_of_chants(self) -> int:
  92         """Returns the number of Chants and Sequences in this Source."""
  93         return self.chant_set.count() + self.sequence_set.count()
  94 
  95     def number_of_melodies(self) -> int:
  96         """Returns the number of Chants in this Source that have melodies."""
  97         return self.chant_set.filter(volpiano__isnull=False).count()
  98 
  99     def __str__(self):
  100         return self.title
  101
  ```
  --- 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()
  
  ```
  
golden_diff: diff --git a/django/cantusdb_project/main_app/models/source.py b/django/cantusdb_project/main_app/models/source.py
  --- a/django/cantusdb_project/main_app/models/source.py
  +++ b/django/cantusdb_project/main_app/models/source.py
  @@ -28,7 +28,12 @@
       )
       # the siglum field as implemented on the old Cantus is composed of both the RISM siglum and the shelfmark
       # it is a human-readable ID for a source
  -    siglum = models.CharField(max_length=63, null=True, blank=True)
  +    siglum = models.CharField(
  +        max_length=63, 
  +        null=True, 
  +        blank=True,
  +        help_text="RISM-style siglum + Shelf-mark (e.g. GB-Ob 202).",
  +    )
       # the RISM siglum uniquely identifies a library or holding institution
       rism_siglum = models.ForeignKey(
           "RismSiglum", on_delete=models.PROTECT, null=True, blank=True,
  @@ -61,6 +66,9 @@
       )
       # TODO: Fill this field up with JSON info when I have access to the Users
       current_editors = models.ManyToManyField(get_user_model(), related_name="sources_edited")
  +    # created_by = models.ForeignKey(
  +    #     get_user_model(), related_name="sources_created", on_delete=models.PROTECT, blank=True, null=True
  +    # )
       inventoried_by = models.ManyToManyField(
           "Indexer", related_name="sources_inventoried"
       )
  @@ -81,7 +89,11 @@
       liturgical_occasions = models.TextField(blank=True, null=True)
       description = models.TextField(blank=True, null=True)
       selected_bibliography = models.TextField(blank=True, null=True)
  -    image_link = models.URLField(blank=True, null=True)
  +    image_link = models.URLField(
  +        blank=True, 
  +        null=True,
  +        help_text='HTTP link to the image gallery of the source.',
  +    )
       indexing_notes = models.TextField(blank=True, null=True)
       indexing_date = models.TextField(blank=True, null=True)
       json_info = models.JSONField(blank=True, null=True)
  
verification_info: {"golden_diff": "diff --git a/django/cantusdb_project/main_app/models/source.py b/django/cantusdb_project/main_app/models/source.py\n--- a/django/cantusdb_project/main_app/models/source.py\n+++ b/django/cantusdb_project/main_app/models/source.py\n@@ -28,7 +28,12 @@\n     )\n     # the siglum field as implemented on the old Cantus is composed of both the RISM siglum and the shelfmark\n     # it is a human-readable ID for a source\n-    siglum = models.CharField(max_length=63, null=True, blank=True)\n+    siglum = models.CharField(\n+        max_length=63, \n+        null=True, \n+        blank=True,\n+        help_text=\"RISM-style siglum + Shelf-mark (e.g. GB-Ob 202).\",\n+    )\n     # the RISM siglum uniquely identifies a library or holding institution\n     rism_siglum = models.ForeignKey(\n         \"RismSiglum\", on_delete=models.PROTECT, null=True, blank=True,\n@@ -61,6 +66,9 @@\n     )\n     # TODO: Fill this field up with JSON info when I have access to the Users\n     current_editors = models.ManyToManyField(get_user_model(), related_name=\"sources_edited\")\n+    # created_by = models.ForeignKey(\n+    #     get_user_model(), related_name=\"sources_created\", on_delete=models.PROTECT, blank=True, null=True\n+    # )\n     inventoried_by = models.ManyToManyField(\n         \"Indexer\", related_name=\"sources_inventoried\"\n     )\n@@ -81,7 +89,11 @@\n     liturgical_occasions = models.TextField(blank=True, null=True)\n     description = models.TextField(blank=True, null=True)\n     selected_bibliography = models.TextField(blank=True, null=True)\n-    image_link = models.URLField(blank=True, null=True)\n+    image_link = models.URLField(\n+        blank=True, \n+        null=True,\n+        help_text='HTTP link to the image gallery of the source.',\n+    )\n     indexing_notes = models.TextField(blank=True, null=True)\n     indexing_date = models.TextField(blank=True, null=True)\n     json_info = models.JSONField(blank=True, null=True)\n", "issue": "Source create page layout could be improved\nAt `source-create/`, the form is not taking up all the horizontal space. This should be an easy fix by changing the column width in Bootstrap. \r\nIt would be better if we keep the same layout as the old Cantus. For example, the first three fields should be on the same row. This will make the form look more compact. \r\nPlus, the width of the fields should be adjusted according to the expected content. For example, the `summary` field should be wider than \"date\". \r\nThe look is not the most important thing, but in this case, a little bit more polishing can go a long way. \n", "before_files": [{"content": "from django.db import models\nfrom main_app.models import BaseModel\nfrom django.contrib.auth import get_user_model\n\n\nclass Source(BaseModel):\n    cursus_choices = [(\"Monastic\", \"Monastic\"), (\"Secular\", \"Secular\")]\n    source_status_choices = [\n        (\n            \"Editing process (not all the fields have been proofread)\",\n            \"Editing process (not all the fields have been proofread)\",\n        ),\n        (\"Published / Complete\", \"Published / Complete\"),\n        (\"Published / Proofread pending\", \"Published / Proofread pending\"),\n        (\"Unpublished / Editing process\", \"Unpublished / Editing process\"),\n        (\"Unpublished / Indexing process\", \"Unpublished / Indexing process\"),\n        (\"Unpublished / Proofread pending\", \"Unpublished / Proofread pending\"),\n        (\"Unpublished / Proofreading process\", \"Unpublished / Proofreading process\"),\n    ]\n\n    # sources with public=False cannot be accessed by its url (access denied) and do not appear in source list\n    public = models.BooleanField(blank=True, null=True)\n    # sources with visible=False can be accessed by typing in the url, but do not appear in source list\n    visible = models.BooleanField(blank=True, null=True)\n    title = models.CharField(\n        max_length=255,\n        help_text=\"Full Manuscript Identification (City, Archive, Shelf-mark)\",\n    )\n    # the siglum field as implemented on the old Cantus is composed of both the RISM siglum and the shelfmark\n    # it is a human-readable ID for a source\n    siglum = models.CharField(max_length=63, null=True, blank=True)\n    # the RISM siglum uniquely identifies a library or holding institution\n    rism_siglum = models.ForeignKey(\n        \"RismSiglum\", on_delete=models.PROTECT, null=True, blank=True,\n    )\n    provenance = models.ForeignKey(\n        \"Provenance\",\n        on_delete=models.PROTECT,\n        help_text=\"If the origin is unknown, select a location where the source was \"\n        \"used later in its lifetime and provide details in the \"\n        '\"Provenance notes\" field.',\n        null=True,\n        blank=True,\n    )\n    provenance_notes = models.TextField(\n        blank=True,\n        null=True,\n        help_text=\"More exact indication of the provenance (if necessary)\",\n    )\n    full_source = models.BooleanField(blank=True, null=True)\n    date = models.CharField(\n        blank=True,\n        null=True,\n        max_length=63,\n        help_text='Date of the manuscript (e.g. \"1200s\", \"1300-1350\", etc.)',\n    )\n    century = models.ManyToManyField(\"Century\", related_name=\"sources\")\n    notation = models.ManyToManyField(\"Notation\", related_name=\"sources\")\n    cursus = models.CharField(\n        blank=True, null=True, choices=cursus_choices, max_length=63\n    )\n    # TODO: Fill this field up with JSON info when I have access to the Users\n    current_editors = models.ManyToManyField(get_user_model(), related_name=\"sources_edited\")\n    inventoried_by = models.ManyToManyField(\n        \"Indexer\", related_name=\"sources_inventoried\"\n    )\n    full_text_entered_by = models.ManyToManyField(\n        \"Indexer\", related_name=\"entered_full_text_for_sources\"\n    )\n    melodies_entered_by = models.ManyToManyField(\n        \"Indexer\", related_name=\"entered_melody_for_sources\"\n    )\n    proofreaders = models.ManyToManyField(\"Indexer\", related_name=\"proofread_sources\")\n    other_editors = models.ManyToManyField(\"Indexer\", related_name=\"edited_sources\")\n    segment = models.ForeignKey(\n        \"Segment\", on_delete=models.PROTECT, blank=True, null=True\n    )\n    source_status = models.CharField(blank=True, null=True, max_length=255)\n    complete_inventory = models.BooleanField(blank=True, null=True)\n    summary = models.TextField(blank=True, null=True)\n    liturgical_occasions = models.TextField(blank=True, null=True)\n    description = models.TextField(blank=True, null=True)\n    selected_bibliography = models.TextField(blank=True, null=True)\n    image_link = models.URLField(blank=True, null=True)\n    indexing_notes = models.TextField(blank=True, null=True)\n    indexing_date = models.TextField(blank=True, null=True)\n    json_info = models.JSONField(blank=True, null=True)\n    fragmentarium_id = models.CharField(max_length=15, blank=True, null=True)\n    dact_id = models.CharField(max_length=15, blank=True, null=True)\n\n    def number_of_chants(self) -> int:\n        \"\"\"Returns the number of Chants and Sequences in this Source.\"\"\"\n        return self.chant_set.count() + self.sequence_set.count()\n\n    def number_of_melodies(self) -> int:\n        \"\"\"Returns the number of Chants in this Source that have melodies.\"\"\"\n        return self.chant_set.filter(volpiano__isnull=False).count()\n\n    def __str__(self):\n        return self.title\n    ", "path": "django/cantusdb_project/main_app/models/source.py"}], "after_files": [{"content": "from django.db import models\nfrom main_app.models import BaseModel\nfrom django.contrib.auth import get_user_model\n\n\nclass Source(BaseModel):\n    cursus_choices = [(\"Monastic\", \"Monastic\"), (\"Secular\", \"Secular\")]\n    source_status_choices = [\n        (\n            \"Editing process (not all the fields have been proofread)\",\n            \"Editing process (not all the fields have been proofread)\",\n        ),\n        (\"Published / Complete\", \"Published / Complete\"),\n        (\"Published / Proofread pending\", \"Published / Proofread pending\"),\n        (\"Unpublished / Editing process\", \"Unpublished / Editing process\"),\n        (\"Unpublished / Indexing process\", \"Unpublished / Indexing process\"),\n        (\"Unpublished / Proofread pending\", \"Unpublished / Proofread pending\"),\n        (\"Unpublished / Proofreading process\", \"Unpublished / Proofreading process\"),\n    ]\n\n    # sources with public=False cannot be accessed by its url (access denied) and do not appear in source list\n    public = models.BooleanField(blank=True, null=True)\n    # sources with visible=False can be accessed by typing in the url, but do not appear in source list\n    visible = models.BooleanField(blank=True, null=True)\n    title = models.CharField(\n        max_length=255,\n        help_text=\"Full Manuscript Identification (City, Archive, Shelf-mark)\",\n    )\n    # the siglum field as implemented on the old Cantus is composed of both the RISM siglum and the shelfmark\n    # it is a human-readable ID for a source\n    siglum = models.CharField(\n        max_length=63, \n        null=True, \n        blank=True,\n        help_text=\"RISM-style siglum + Shelf-mark (e.g. GB-Ob 202).\",\n    )\n    # the RISM siglum uniquely identifies a library or holding institution\n    rism_siglum = models.ForeignKey(\n        \"RismSiglum\", on_delete=models.PROTECT, null=True, blank=True,\n    )\n    provenance = models.ForeignKey(\n        \"Provenance\",\n        on_delete=models.PROTECT,\n        help_text=\"If the origin is unknown, select a location where the source was \"\n        \"used later in its lifetime and provide details in the \"\n        '\"Provenance notes\" field.',\n        null=True,\n        blank=True,\n    )\n    provenance_notes = models.TextField(\n        blank=True,\n        null=True,\n        help_text=\"More exact indication of the provenance (if necessary)\",\n    )\n    full_source = models.BooleanField(blank=True, null=True)\n    date = models.CharField(\n        blank=True,\n        null=True,\n        max_length=63,\n        help_text='Date of the manuscript (e.g. \"1200s\", \"1300-1350\", etc.)',\n    )\n    century = models.ManyToManyField(\"Century\", related_name=\"sources\")\n    notation = models.ManyToManyField(\"Notation\", related_name=\"sources\")\n    cursus = models.CharField(\n        blank=True, null=True, choices=cursus_choices, max_length=63\n    )\n    # TODO: Fill this field up with JSON info when I have access to the Users\n    current_editors = models.ManyToManyField(get_user_model(), related_name=\"sources_edited\")\n    # created_by = models.ForeignKey(\n    #     get_user_model(), related_name=\"sources_created\", on_delete=models.PROTECT, blank=True, null=True\n    # )\n    inventoried_by = models.ManyToManyField(\n        \"Indexer\", related_name=\"sources_inventoried\"\n    )\n    full_text_entered_by = models.ManyToManyField(\n        \"Indexer\", related_name=\"entered_full_text_for_sources\"\n    )\n    melodies_entered_by = models.ManyToManyField(\n        \"Indexer\", related_name=\"entered_melody_for_sources\"\n    )\n    proofreaders = models.ManyToManyField(\"Indexer\", related_name=\"proofread_sources\")\n    other_editors = models.ManyToManyField(\"Indexer\", related_name=\"edited_sources\")\n    segment = models.ForeignKey(\n        \"Segment\", on_delete=models.PROTECT, blank=True, null=True\n    )\n    source_status = models.CharField(blank=True, null=True, max_length=255)\n    complete_inventory = models.BooleanField(blank=True, null=True)\n    summary = models.TextField(blank=True, null=True)\n    liturgical_occasions = models.TextField(blank=True, null=True)\n    description = models.TextField(blank=True, null=True)\n    selected_bibliography = models.TextField(blank=True, null=True)\n    image_link = models.URLField(\n        blank=True, \n        null=True,\n        help_text='HTTP link to the image gallery of the source.',\n    )\n    indexing_notes = models.TextField(blank=True, null=True)\n    indexing_date = models.TextField(blank=True, null=True)\n    json_info = models.JSONField(blank=True, null=True)\n    fragmentarium_id = models.CharField(max_length=15, blank=True, null=True)\n    dact_id = models.CharField(max_length=15, blank=True, null=True)\n\n    def number_of_chants(self) -> int:\n        \"\"\"Returns the number of Chants and Sequences in this Source.\"\"\"\n        return self.chant_set.count() + self.sequence_set.count()\n\n    def number_of_melodies(self) -> int:\n        \"\"\"Returns the number of Chants in this Source that have melodies.\"\"\"\n        return self.chant_set.filter(volpiano__isnull=False).count()\n\n    def __str__(self):\n        return self.title\n    ", "path": "django/cantusdb_project/main_app/models/source.py"}]}