prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  Erro encontrado quando a audiência não possui matéria ligada.
  <!--- Forneça um resumo geral da _issue_ no título acima -->
  Erro encontrado quando a audiência não possui matéria ligada. Derivado do ticket [273270](https://suporte.interlegis.leg.br/scp/tickets.php?id=37122)
  
  
  
  ## Contexto
  <!--- Como esse problema o afeta? O que você está tentando realizar? -->
  <!--- Fornecer o contexto nos ajuda a encontrar uma solução que seja mais útil no mundo real -->
  
  ## Imagens do Ocorrido
  <!--- Representação visual em vídeo ou imagem do ocorrido -->
  <!--- Se está descrevendo um bug poste imagens ou vídeos na reprodução do bug citado, caso se aplique -->
  
  ## Seu Ambiente
  <!--- Inclua detalhes relevantes sobre o ambiente em que você presenciou/experienciou o bug. -->
  * Versão usada (_Release_):
  * Nome e versão do navegador:
  * Nome e versão do Sistema Operacional (desktop ou mobile):
  * Link para o seu projeto (Caso de fork deste projeto):
  
  
  </issue>
  <code>
  [start of sapl/audiencia/views.py]
  1 import sapl
  2 
  3 from django.http import HttpResponse
  4 from django.core.urlresolvers import reverse
  5 from django.views.decorators.clickjacking import xframe_options_exempt
  6 from django.views.generic import UpdateView
  7 from sapl.crud.base import RP_DETAIL, RP_LIST, Crud, MasterDetailCrud
  8 
  9 from .forms import AudienciaForm, AnexoAudienciaPublicaForm
  10 from .models import AudienciaPublica, AnexoAudienciaPublica
  11 
  12 
  13 def index(request):
  14     return HttpResponse("Audiência  Pública")
  15 
  16 
  17 class AudienciaCrud(Crud):
  18     model = AudienciaPublica
  19     public = [RP_LIST, RP_DETAIL, ]
  20 
  21     class BaseMixin(Crud.BaseMixin):
  22         list_field_names = ['numero', 'nome', 'tipo', 'materia',
  23                             'data'] 
  24         ordering = '-data', 'nome', 'numero', 'tipo'
  25 
  26     class ListView(Crud.ListView):
  27         paginate_by = 10
  28 
  29         def get_context_data(self, **kwargs):
  30             context = super().get_context_data(**kwargs)
  31 
  32             audiencia_materia = {}
  33             for o in context['object_list']:
  34                 # indexado pelo numero da audiencia
  35                 audiencia_materia[str(o.numero)] = o.materia
  36 
  37             for row in context['rows']:
  38                 coluna_materia = row[3] # se mudar a ordem de listagem mudar aqui
  39                 if coluna_materia[0]:
  40                     materia = audiencia_materia[row[0][0]]
  41                     url_materia = reverse('sapl.materia:materialegislativa_detail',
  42                                           kwargs={'pk': materia.id})
  43                     row[3] = (coluna_materia[0], url_materia)
  44             return context
  45 
  46     class CreateView(Crud.CreateView):
  47         form_class = AudienciaForm
  48 
  49         def form_valid(self, form):
  50             return super(Crud.CreateView, self).form_valid(form)
  51 
  52     class UpdateView(Crud.UpdateView):
  53         form_class = AudienciaForm
  54 
  55         def get_initial(self):
  56             initial = super(UpdateView, self).get_initial()
  57             if self.object.materia:
  58                 initial['tipo_materia'] = self.object.materia.tipo.id
  59                 initial['numero_materia'] = self.object.materia.numero
  60                 initial['ano_materia'] = self.object.materia.ano
  61             return initial
  62      
  63     class DeleteView(Crud.DeleteView):
  64         pass
  65 
  66     class DetailView(Crud.DetailView):
  67 
  68         layout_key = 'AudienciaPublicaDetail'
  69 
  70         @xframe_options_exempt
  71         def get(self, request, *args, **kwargs):
  72             return super().get(request, *args, **kwargs)
  73 
  74 
  75 class AudienciaPublicaMixin:
  76 
  77     def has_permission(self):
  78         app_config = sapl.base.models.AppConfig.objects.last()
  79         if app_config and app_config.documentos_administrativos == 'O':
  80             return True
  81 
  82         return super().has_permission()
  83 
  84 
  85 class AnexoAudienciaPublicaCrud(MasterDetailCrud):
  86     model = AnexoAudienciaPublica
  87     parent_field = 'audiencia'
  88     help_topic = 'numeracao_docsacess'
  89     public = [RP_LIST, RP_DETAIL, ]
  90 
  91     class BaseMixin(MasterDetailCrud.BaseMixin):
  92         list_field_names = ['assunto']
  93 
  94     class CreateView(MasterDetailCrud.CreateView):
  95         form_class = AnexoAudienciaPublicaForm
  96         layout_key = None
  97 
  98     class UpdateView(MasterDetailCrud.UpdateView):
  99         form_class = AnexoAudienciaPublicaForm
  100 
  101     class ListView(AudienciaPublicaMixin, MasterDetailCrud.ListView):
  102 
  103         def get_queryset(self):
  104             qs = super(MasterDetailCrud.ListView, self).get_queryset()
  105             kwargs = {self.crud.parent_field: self.kwargs['pk']}
  106             return qs.filter(**kwargs).order_by('-data', '-id')
  107 
  108     class DetailView(AudienciaPublicaMixin, MasterDetailCrud.DetailView):
  109         pass
  110
  [end of sapl/audiencia/views.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/sapl/audiencia/views.py b/sapl/audiencia/views.py
  --- a/sapl/audiencia/views.py
  +++ b/sapl/audiencia/views.py
  @@ -38,8 +38,11 @@
                   coluna_materia = row[3] # se mudar a ordem de listagem mudar aqui
                   if coluna_materia[0]:
                       materia = audiencia_materia[row[0][0]]
  -                    url_materia = reverse('sapl.materia:materialegislativa_detail',
  -                                          kwargs={'pk': materia.id})
  +                    if materia:
  +                        url_materia = reverse('sapl.materia:materialegislativa_detail',
  +                                              kwargs={'pk': materia.id})
  +                    else:
  +                        url_materia = None
                       row[3] = (coluna_materia[0], url_materia)
               return context
  
verification_info: {"golden_diff": "diff --git a/sapl/audiencia/views.py b/sapl/audiencia/views.py\n--- a/sapl/audiencia/views.py\n+++ b/sapl/audiencia/views.py\n@@ -38,8 +38,11 @@\n                 coluna_materia = row[3] # se mudar a ordem de listagem mudar aqui\n                 if coluna_materia[0]:\n                     materia = audiencia_materia[row[0][0]]\n-                    url_materia = reverse('sapl.materia:materialegislativa_detail',\n-                                          kwargs={'pk': materia.id})\n+                    if materia:\n+                        url_materia = reverse('sapl.materia:materialegislativa_detail',\n+                                              kwargs={'pk': materia.id})\n+                    else:\n+                        url_materia = None\n                     row[3] = (coluna_materia[0], url_materia)\n             return context\n", "issue": "Erro encontrado quando a audi\u00eancia n\u00e3o possui mat\u00e9ria ligada.\n<!--- Forne\u00e7a um resumo geral da _issue_ no t\u00edtulo acima -->\r\nErro encontrado quando a audi\u00eancia n\u00e3o possui mat\u00e9ria ligada. Derivado do ticket [273270](https://suporte.interlegis.leg.br/scp/tickets.php?id=37122)\r\n\r\n\r\n\r\n## Contexto\r\n<!--- Como esse problema o afeta? O que voc\u00ea est\u00e1 tentando realizar? -->\r\n<!--- Fornecer o contexto nos ajuda a encontrar uma solu\u00e7\u00e3o que seja mais \u00fatil no mundo real -->\r\n\r\n## Imagens do Ocorrido\r\n<!--- Representa\u00e7\u00e3o visual em v\u00eddeo ou imagem do ocorrido -->\r\n<!--- Se est\u00e1 descrevendo um bug poste imagens ou v\u00eddeos na reprodu\u00e7\u00e3o do bug citado, caso se aplique -->\r\n\r\n## Seu Ambiente\r\n<!--- Inclua detalhes relevantes sobre o ambiente em que voc\u00ea presenciou/experienciou o bug. -->\r\n* Vers\u00e3o usada (_Release_):\r\n* Nome e vers\u00e3o do navegador:\r\n* Nome e vers\u00e3o do Sistema Operacional (desktop ou mobile):\r\n* Link para o seu projeto (Caso de fork deste projeto):\r\n\n", "before_files": [{"content": "import sapl\n\nfrom django.http import HttpResponse\nfrom django.core.urlresolvers import reverse\nfrom django.views.decorators.clickjacking import xframe_options_exempt\nfrom django.views.generic import UpdateView\nfrom sapl.crud.base import RP_DETAIL, RP_LIST, Crud, MasterDetailCrud\n\nfrom .forms import AudienciaForm, AnexoAudienciaPublicaForm\nfrom .models import AudienciaPublica, AnexoAudienciaPublica\n\n\ndef index(request):\n    return HttpResponse(\"Audi\u00eancia  P\u00fablica\")\n\n\nclass AudienciaCrud(Crud):\n    model = AudienciaPublica\n    public = [RP_LIST, RP_DETAIL, ]\n\n    class BaseMixin(Crud.BaseMixin):\n        list_field_names = ['numero', 'nome', 'tipo', 'materia',\n                            'data'] \n        ordering = '-data', 'nome', 'numero', 'tipo'\n\n    class ListView(Crud.ListView):\n        paginate_by = 10\n\n        def get_context_data(self, **kwargs):\n            context = super().get_context_data(**kwargs)\n\n            audiencia_materia = {}\n            for o in context['object_list']:\n                # indexado pelo numero da audiencia\n                audiencia_materia[str(o.numero)] = o.materia\n\n            for row in context['rows']:\n                coluna_materia = row[3] # se mudar a ordem de listagem mudar aqui\n                if coluna_materia[0]:\n                    materia = audiencia_materia[row[0][0]]\n                    url_materia = reverse('sapl.materia:materialegislativa_detail',\n                                          kwargs={'pk': materia.id})\n                    row[3] = (coluna_materia[0], url_materia)\n            return context\n\n    class CreateView(Crud.CreateView):\n        form_class = AudienciaForm\n\n        def form_valid(self, form):\n            return super(Crud.CreateView, self).form_valid(form)\n\n    class UpdateView(Crud.UpdateView):\n        form_class = AudienciaForm\n\n        def get_initial(self):\n            initial = super(UpdateView, self).get_initial()\n            if self.object.materia:\n                initial['tipo_materia'] = self.object.materia.tipo.id\n                initial['numero_materia'] = self.object.materia.numero\n                initial['ano_materia'] = self.object.materia.ano\n            return initial\n     \n    class DeleteView(Crud.DeleteView):\n        pass\n\n    class DetailView(Crud.DetailView):\n\n        layout_key = 'AudienciaPublicaDetail'\n\n        @xframe_options_exempt\n        def get(self, request, *args, **kwargs):\n            return super().get(request, *args, **kwargs)\n\n\nclass AudienciaPublicaMixin:\n\n    def has_permission(self):\n        app_config = sapl.base.models.AppConfig.objects.last()\n        if app_config and app_config.documentos_administrativos == 'O':\n            return True\n\n        return super().has_permission()\n\n\nclass AnexoAudienciaPublicaCrud(MasterDetailCrud):\n    model = AnexoAudienciaPublica\n    parent_field = 'audiencia'\n    help_topic = 'numeracao_docsacess'\n    public = [RP_LIST, RP_DETAIL, ]\n\n    class BaseMixin(MasterDetailCrud.BaseMixin):\n        list_field_names = ['assunto']\n\n    class CreateView(MasterDetailCrud.CreateView):\n        form_class = AnexoAudienciaPublicaForm\n        layout_key = None\n\n    class UpdateView(MasterDetailCrud.UpdateView):\n        form_class = AnexoAudienciaPublicaForm\n\n    class ListView(AudienciaPublicaMixin, MasterDetailCrud.ListView):\n\n        def get_queryset(self):\n            qs = super(MasterDetailCrud.ListView, self).get_queryset()\n            kwargs = {self.crud.parent_field: self.kwargs['pk']}\n            return qs.filter(**kwargs).order_by('-data', '-id')\n\n    class DetailView(AudienciaPublicaMixin, MasterDetailCrud.DetailView):\n        pass\n", "path": "sapl/audiencia/views.py"}]}