mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-11-03 03:16:10 -06:00 
			
		
		
		
	Use frontend settings instead of env variable
This commit is contained in:
		@@ -169,7 +169,7 @@
 | 
				
			|||||||
                        </div>
 | 
					                        </div>
 | 
				
			||||||
                    </ng-template>
 | 
					                    </ng-template>
 | 
				
			||||||
                </li>
 | 
					                </li>
 | 
				
			||||||
                <li [ngbNavItem]="5" *ngIf="isCommentsEnabled">
 | 
					                <li [ngbNavItem]="5" *ngIf="commentsEnabled">
 | 
				
			||||||
                    <a ngbNavLink i18n>Comments</a>
 | 
					                    <a ngbNavLink i18n>Comments</a>
 | 
				
			||||||
                    <ng-template ngbNavContent>
 | 
					                    <ng-template ngbNavContent>
 | 
				
			||||||
                        <app-document-comment #commentComponent></app-document-comment>
 | 
					                        <app-document-comment #commentComponent></app-document-comment>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,7 +35,6 @@ import { StoragePathService } from 'src/app/services/rest/storage-path.service'
 | 
				
			|||||||
import { PaperlessStoragePath } from 'src/app/data/paperless-storage-path'
 | 
					import { PaperlessStoragePath } from 'src/app/data/paperless-storage-path'
 | 
				
			||||||
import { StoragePathEditDialogComponent } from '../common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component'
 | 
					import { StoragePathEditDialogComponent } from '../common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component'
 | 
				
			||||||
import { SETTINGS_KEYS } from 'src/app/data/paperless-uisettings'
 | 
					import { SETTINGS_KEYS } from 'src/app/data/paperless-uisettings'
 | 
				
			||||||
import { EnvironmentService } from 'src/app/services/rest/environment.service'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Component({
 | 
					@Component({
 | 
				
			||||||
  selector: 'app-document-detail',
 | 
					  selector: 'app-document-detail',
 | 
				
			||||||
@@ -84,8 +83,6 @@ export class DocumentDetailComponent
 | 
				
			|||||||
  previewCurrentPage: number = 1
 | 
					  previewCurrentPage: number = 1
 | 
				
			||||||
  previewNumPages: number = 1
 | 
					  previewNumPages: number = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  isCommentsEnabled:boolean = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  store: BehaviorSubject<any>
 | 
					  store: BehaviorSubject<any>
 | 
				
			||||||
  isDirty$: Observable<boolean>
 | 
					  isDirty$: Observable<boolean>
 | 
				
			||||||
  unsubscribeNotifier: Subject<any> = new Subject()
 | 
					  unsubscribeNotifier: Subject<any> = new Subject()
 | 
				
			||||||
@@ -121,8 +118,7 @@ export class DocumentDetailComponent
 | 
				
			|||||||
    private documentTitlePipe: DocumentTitlePipe,
 | 
					    private documentTitlePipe: DocumentTitlePipe,
 | 
				
			||||||
    private toastService: ToastService,
 | 
					    private toastService: ToastService,
 | 
				
			||||||
    private settings: SettingsService,
 | 
					    private settings: SettingsService,
 | 
				
			||||||
    private storagePathService: StoragePathService,
 | 
					    private storagePathService: StoragePathService
 | 
				
			||||||
    private environment: EnvironmentService
 | 
					 | 
				
			||||||
  ) {}
 | 
					  ) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  titleKeyUp(event) {
 | 
					  titleKeyUp(event) {
 | 
				
			||||||
@@ -278,12 +274,6 @@ export class DocumentDetailComponent
 | 
				
			|||||||
          this.suggestions = null
 | 
					          this.suggestions = null
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    this.environment.get("PAPERLESS_COMMENTS_ENABLED").subscribe(result => {
 | 
					 | 
				
			||||||
      this.isCommentsEnabled = (result.value.toString().toLowerCase() === "true"?true:false);
 | 
					 | 
				
			||||||
    }, error => {
 | 
					 | 
				
			||||||
      this.isCommentsEnabled = false;
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.title = this.documentTitlePipe.transform(doc.title)
 | 
					    this.title = this.documentTitlePipe.transform(doc.title)
 | 
				
			||||||
    this.documentForm.patchValue(doc)
 | 
					    this.documentForm.patchValue(doc)
 | 
				
			||||||
@@ -562,4 +552,8 @@ export class DocumentDetailComponent
 | 
				
			|||||||
      this.password = (event.target as HTMLInputElement).value
 | 
					      this.password = (event.target as HTMLInputElement).value
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  get commentsEnabled(): boolean {
 | 
				
			||||||
 | 
					    return this.settings.get(SETTINGS_KEYS.COMMENTS_ENABLED)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -125,6 +125,14 @@
 | 
				
			|||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <h4 class="mt-4" i18n>Comments</h4>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <div class="row mb-3">
 | 
				
			||||||
 | 
					          <div class="offset-md-3 col">
 | 
				
			||||||
 | 
					            <app-input-check i18n-title title="Enable comments" formControlName="commentsEnabled"></app-input-check>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      </ng-template>
 | 
					      </ng-template>
 | 
				
			||||||
    </li>
 | 
					    </li>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,6 +44,7 @@ export class SettingsComponent implements OnInit, OnDestroy, DirtyComponent {
 | 
				
			|||||||
    notificationsConsumerSuccess: new FormControl(null),
 | 
					    notificationsConsumerSuccess: new FormControl(null),
 | 
				
			||||||
    notificationsConsumerFailed: new FormControl(null),
 | 
					    notificationsConsumerFailed: new FormControl(null),
 | 
				
			||||||
    notificationsConsumerSuppressOnDashboard: new FormControl(null),
 | 
					    notificationsConsumerSuppressOnDashboard: new FormControl(null),
 | 
				
			||||||
 | 
					    commentsEnabled: new FormControl(null),
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  savedViews: PaperlessSavedView[]
 | 
					  savedViews: PaperlessSavedView[]
 | 
				
			||||||
@@ -116,6 +117,7 @@ export class SettingsComponent implements OnInit, OnDestroy, DirtyComponent {
 | 
				
			|||||||
        notificationsConsumerSuppressOnDashboard: this.settings.get(
 | 
					        notificationsConsumerSuppressOnDashboard: this.settings.get(
 | 
				
			||||||
          SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_SUPPRESS_ON_DASHBOARD
 | 
					          SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_SUPPRESS_ON_DASHBOARD
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
 | 
					        commentsEnabled: this.settings.get(SETTINGS_KEYS.COMMENTS_ENABLED),
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for (let view of this.savedViews) {
 | 
					      for (let view of this.savedViews) {
 | 
				
			||||||
@@ -234,6 +236,10 @@ export class SettingsComponent implements OnInit, OnDestroy, DirtyComponent {
 | 
				
			|||||||
      SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_SUPPRESS_ON_DASHBOARD,
 | 
					      SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_SUPPRESS_ON_DASHBOARD,
 | 
				
			||||||
      this.settingsForm.value.notificationsConsumerSuppressOnDashboard
 | 
					      this.settingsForm.value.notificationsConsumerSuppressOnDashboard
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					    this.settings.set(
 | 
				
			||||||
 | 
					      SETTINGS_KEYS.COMMENTS_ENABLED,
 | 
				
			||||||
 | 
					      this.settingsForm.value.commentsEnabled
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
    this.settings.setLanguage(this.settingsForm.value.displayLanguage)
 | 
					    this.settings.setLanguage(this.settingsForm.value.displayLanguage)
 | 
				
			||||||
    this.settings
 | 
					    this.settings
 | 
				
			||||||
      .storeSettings()
 | 
					      .storeSettings()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +0,0 @@
 | 
				
			|||||||
export interface PaperlessEnvironment {
 | 
					 | 
				
			||||||
    value?: string;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -36,6 +36,7 @@ export const SETTINGS_KEYS = {
 | 
				
			|||||||
    'general-settings:notifications:consumer-failed',
 | 
					    'general-settings:notifications:consumer-failed',
 | 
				
			||||||
  NOTIFICATIONS_CONSUMER_SUPPRESS_ON_DASHBOARD:
 | 
					  NOTIFICATIONS_CONSUMER_SUPPRESS_ON_DASHBOARD:
 | 
				
			||||||
    'general-settings:notifications:consumer-suppress-on-dashboard',
 | 
					    'general-settings:notifications:consumer-suppress-on-dashboard',
 | 
				
			||||||
 | 
					  COMMENTS_ENABLED: 'general-settings:comments-enabled',
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const SETTINGS: PaperlessUiSetting[] = [
 | 
					export const SETTINGS: PaperlessUiSetting[] = [
 | 
				
			||||||
@@ -114,4 +115,9 @@ export const SETTINGS: PaperlessUiSetting[] = [
 | 
				
			|||||||
    type: 'boolean',
 | 
					    type: 'boolean',
 | 
				
			||||||
    default: true,
 | 
					    default: true,
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    key: SETTINGS_KEYS.COMMENTS_ENABLED,
 | 
				
			||||||
 | 
					    type: 'boolean',
 | 
				
			||||||
 | 
					    default: true,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,16 +0,0 @@
 | 
				
			|||||||
import { TestBed } from '@angular/core/testing';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import { EnvironmentService } from './environment.service';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
describe('EnvironmentService', () => {
 | 
					 | 
				
			||||||
  let service: EnvironmentService;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  beforeEach(() => {
 | 
					 | 
				
			||||||
    TestBed.configureTestingModule({});
 | 
					 | 
				
			||||||
    service = TestBed.inject(EnvironmentService);
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  it('should be created', () => {
 | 
					 | 
				
			||||||
    expect(service).toBeTruthy();
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
@@ -1,22 +0,0 @@
 | 
				
			|||||||
import { HttpClient, HttpParams } from '@angular/common/http';
 | 
					 | 
				
			||||||
import { Injectable } from '@angular/core';
 | 
					 | 
				
			||||||
import { Observable } from 'rxjs';
 | 
					 | 
				
			||||||
import { PaperlessEnvironment } from 'src/app/data/paperless-environment';
 | 
					 | 
				
			||||||
import { environment } from 'src/environments/environment'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@Injectable({
 | 
					 | 
				
			||||||
  providedIn: 'root'
 | 
					 | 
				
			||||||
})
 | 
					 | 
				
			||||||
export class EnvironmentService {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  protected baseUrl: string = environment.apiBaseUrl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  constructor(protected http: HttpClient) { }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  get(environment: string): Observable<PaperlessEnvironment> {
 | 
					 | 
				
			||||||
    let httpParams = new HttpParams();
 | 
					 | 
				
			||||||
    httpParams = httpParams.set('name', environment);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return this.http.get<PaperlessEnvironment>(`${this.baseUrl}environment/`, {params: httpParams})
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -22,7 +22,6 @@ from django.http import Http404
 | 
				
			|||||||
from django.http import HttpResponse
 | 
					from django.http import HttpResponse
 | 
				
			||||||
from django.http import HttpResponseBadRequest
 | 
					from django.http import HttpResponseBadRequest
 | 
				
			||||||
from django.http import HttpResponseNotAllowed
 | 
					from django.http import HttpResponseNotAllowed
 | 
				
			||||||
from django.http import HttpResponseNotFound
 | 
					 | 
				
			||||||
from django.utils.decorators import method_decorator
 | 
					from django.utils.decorators import method_decorator
 | 
				
			||||||
from django.utils.translation import get_language
 | 
					from django.utils.translation import get_language
 | 
				
			||||||
from django.views.decorators.cache import cache_control
 | 
					from django.views.decorators.cache import cache_control
 | 
				
			||||||
@@ -385,21 +384,22 @@ class DocumentViewSet(
 | 
				
			|||||||
    def getComments(self, doc):
 | 
					    def getComments(self, doc):
 | 
				
			||||||
        return [
 | 
					        return [
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                "id":c.id, 
 | 
					                "id": c.id,
 | 
				
			||||||
                "comment":c.comment, 
 | 
					                "comment": c.comment,
 | 
				
			||||||
                "created":c.created, 
 | 
					                "created": c.created,
 | 
				
			||||||
                "user":{ 
 | 
					                "user": {
 | 
				
			||||||
                    "id":c.user.id, 
 | 
					                    "id": c.user.id,
 | 
				
			||||||
                    "username": c.user.username,
 | 
					                    "username": c.user.username,
 | 
				
			||||||
                    "firstname":c.user.first_name, 
 | 
					                    "firstname": c.user.first_name,
 | 
				
			||||||
                    "lastname":c.user.last_name
 | 
					                    "lastname": c.user.last_name,
 | 
				
			||||||
                }
 | 
					                },
 | 
				
			||||||
            } for c in Comment.objects.filter(document=doc).order_by('-created')
 | 
					            }
 | 
				
			||||||
        ];
 | 
					            for c in Comment.objects.filter(document=doc).order_by("-created")
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @action(methods=['get', 'post', 'delete'], detail=True)
 | 
					    @action(methods=["get", "post", "delete"], detail=True)
 | 
				
			||||||
    def comments(self, request, pk=None):
 | 
					    def comments(self, request, pk=None):
 | 
				
			||||||
        if settings.PAPERLESS_COMMENTS_ENABLED != True:
 | 
					        if settings.PAPERLESS_COMMENTS_ENABLED is not True:
 | 
				
			||||||
            return HttpResponseNotAllowed("comment function is disabled")
 | 
					            return HttpResponseNotAllowed("comment function is disabled")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
@@ -407,35 +407,39 @@ class DocumentViewSet(
 | 
				
			|||||||
        except Document.DoesNotExist:
 | 
					        except Document.DoesNotExist:
 | 
				
			||||||
            raise Http404()
 | 
					            raise Http404()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        currentUser = request.user;
 | 
					        currentUser = request.user
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if request.method == 'GET': 
 | 
					        if request.method == "GET":
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                return Response(self.getComments(doc));
 | 
					                return Response(self.getComments(doc))
 | 
				
			||||||
            except Exception as e:
 | 
					            except Exception as e:
 | 
				
			||||||
                return Response({"error": str(e)});
 | 
					                return Response({"error": str(e)})
 | 
				
			||||||
        elif request.method == 'POST':
 | 
					        elif request.method == "POST":
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                c = Comment.objects.create(
 | 
					                c = Comment.objects.create(
 | 
				
			||||||
                    document = doc,
 | 
					                    document=doc,
 | 
				
			||||||
                    comment=request.data["payload"],
 | 
					                    comment=request.data["payload"],
 | 
				
			||||||
                    user=currentUser
 | 
					                    user=currentUser,
 | 
				
			||||||
                );
 | 
					                )
 | 
				
			||||||
                c.save();
 | 
					                c.save()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                return Response(self.getComments(doc));
 | 
					                return Response(self.getComments(doc))
 | 
				
			||||||
            except Exception as e:
 | 
					            except Exception as e:
 | 
				
			||||||
                return Response({
 | 
					                return Response(
 | 
				
			||||||
                    "error": str(e)
 | 
					                    {
 | 
				
			||||||
                });
 | 
					                        "error": str(e),
 | 
				
			||||||
        elif request.method == 'DELETE':
 | 
					                    },
 | 
				
			||||||
            comment = Comment.objects.get(id=int(request.GET.get("commentId")));
 | 
					                )
 | 
				
			||||||
            comment.delete();
 | 
					        elif request.method == "DELETE":
 | 
				
			||||||
            return Response(self.getComments(doc));
 | 
					            comment = Comment.objects.get(id=int(request.GET.get("commentId")))
 | 
				
			||||||
 | 
					            comment.delete()
 | 
				
			||||||
 | 
					            return Response(self.getComments(doc))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return Response({
 | 
					        return Response(
 | 
				
			||||||
            "error": "error"
 | 
					            {
 | 
				
			||||||
        });
 | 
					                "error": "error",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class SearchResultSerializer(DocumentSerializer):
 | 
					class SearchResultSerializer(DocumentSerializer):
 | 
				
			||||||
@@ -893,32 +897,3 @@ class AcknowledgeTasksView(GenericAPIView):
 | 
				
			|||||||
            return Response({"result": result})
 | 
					            return Response({"result": result})
 | 
				
			||||||
        except Exception:
 | 
					        except Exception:
 | 
				
			||||||
            return HttpResponseBadRequest()
 | 
					            return HttpResponseBadRequest()
 | 
				
			||||||
 | 
					 | 
				
			||||||
class EnvironmentView(APIView):
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    permission_classes = (IsAuthenticated,)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def get(self, request, format=None):
 | 
					 | 
				
			||||||
        if 'name' in request.query_params:
 | 
					 | 
				
			||||||
            name = request.query_params['name']
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            return HttpResponseBadRequest("name required")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if(name not in settings.PAPERLESS_FRONTEND_ALLOWED_ENVIRONMENTS and settings.PAPERLESS_DISABLED_FRONTEND_ENVIRONMENT_CHECK == False):
 | 
					 | 
				
			||||||
            return HttpResponseNotAllowed("environment not allowed to request")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        value = None
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            value = getattr(settings, name)
 | 
					 | 
				
			||||||
        except:
 | 
					 | 
				
			||||||
            try:
 | 
					 | 
				
			||||||
                value = os.getenv(name)
 | 
					 | 
				
			||||||
            except:
 | 
					 | 
				
			||||||
                value = None
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if value == None: 
 | 
					 | 
				
			||||||
            return HttpResponseNotFound("environment not found")    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return Response({
 | 
					 | 
				
			||||||
            "value": str(value)
 | 
					 | 
				
			||||||
        }); 
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -566,15 +566,6 @@ CONVERT_MEMORY_LIMIT = os.getenv("PAPERLESS_CONVERT_MEMORY_LIMIT")
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
GS_BINARY = os.getenv("PAPERLESS_GS_BINARY", "gs")
 | 
					GS_BINARY = os.getenv("PAPERLESS_GS_BINARY", "gs")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Comment settings
 | 
					 | 
				
			||||||
PAPERLESS_COMMENTS_ENABLED = __get_boolean("PAPERLESS_COMMENTS_ENABLED", "NO")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# allowed environments for frontend
 | 
					 | 
				
			||||||
PAPERLESS_DISABLED_FRONTEND_ENVIRONMENT_CHECK = __get_boolean("PAPERLESS_DISABLED_FRONTEND_ENVIRONMENT_CHECK", "NO")
 | 
					 | 
				
			||||||
PAPERLESS_FRONTEND_ALLOWED_ENVIRONMENTS = [
 | 
					 | 
				
			||||||
    "PAPERLESS_COMMENTS_ENABLED"
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Pre-2.x versions of Paperless stored your documents locally with GPG
 | 
					# Pre-2.x versions of Paperless stored your documents locally with GPG
 | 
				
			||||||
# encryption, but that is no longer the default.  This behaviour is still
 | 
					# encryption, but that is no longer the default.  This behaviour is still
 | 
				
			||||||
# available, but it must be explicitly enabled by setting
 | 
					# available, but it must be explicitly enabled by setting
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,6 @@ from django.utils.translation import gettext_lazy as _
 | 
				
			|||||||
from django.views.decorators.csrf import csrf_exempt
 | 
					from django.views.decorators.csrf import csrf_exempt
 | 
				
			||||||
from django.views.generic import RedirectView
 | 
					from django.views.generic import RedirectView
 | 
				
			||||||
from documents.views import AcknowledgeTasksView
 | 
					from documents.views import AcknowledgeTasksView
 | 
				
			||||||
from documents.views import EnvironmentView
 | 
					 | 
				
			||||||
from documents.views import BulkDownloadView
 | 
					from documents.views import BulkDownloadView
 | 
				
			||||||
from documents.views import BulkEditView
 | 
					from documents.views import BulkEditView
 | 
				
			||||||
from documents.views import CorrespondentViewSet
 | 
					from documents.views import CorrespondentViewSet
 | 
				
			||||||
@@ -95,7 +94,6 @@ urlpatterns = [
 | 
				
			|||||||
                    AcknowledgeTasksView.as_view(),
 | 
					                    AcknowledgeTasksView.as_view(),
 | 
				
			||||||
                    name="acknowledge_tasks",
 | 
					                    name="acknowledge_tasks",
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
                re_path(r"^environment/", EnvironmentView.as_view()),
 | 
					 | 
				
			||||||
                path("token/", views.obtain_auth_token),
 | 
					                path("token/", views.obtain_auth_token),
 | 
				
			||||||
            ]
 | 
					            ]
 | 
				
			||||||
            + api_router.urls,
 | 
					            + api_router.urls,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user