Ver código fonte

Adding support for ungrouping access

- Home page redesign.
- Review of all .css files.
- New users now have the "CLIENT" group by default.
- Access to pages and some content on pages can now vary by the groups the user belongs to.
TonyKurts 1 mês atrás
pai
commit
0e7e13c051

+ 1 - 1
core/settings.py

@@ -71,7 +71,7 @@ MIDDLEWARE = [
 
 ROOT_URLCONF = "core.urls"
 LOGIN_URL = "sharix_admin:auth_login"
-LOGIN_REDIRECT_URL = "sharix_admin:home"
+LOGIN_REDIRECT_URL = "sharix_admin:main"
 LOGOUT_REDIRECT_URL = "sharix_admin:auth_login"
 
 SESSION_EXPIRE_AT_BROWSER_CLOSE = False

+ 2 - 0
sharix_admin/forms/auth.py

@@ -1,6 +1,7 @@
 from django import forms
 from django.contrib.auth.forms import UserCreationForm, AuthenticationForm, UsernameField
 from django.contrib.auth import get_user_model
+from django.contrib.auth.models import Group
 
 from sharix_admin.forms import BaseForm
 
@@ -14,6 +15,7 @@ class ShariXSignUpForm(BaseForm, UserCreationForm):
         user.username = self.cleaned_data['phone_number'] # FIXME: Имя пользователя = номер телефона
         if commit:
             user.save()
+            user.groups.add(Group.objects.get(id=51)) # Добавляем всех пользователей по умолчанию в группу CLIENT
         return user
 
     class Meta:

+ 0 - 85
sharix_admin/static/drf-yasg/colors2.css

@@ -1,85 +0,0 @@
-
-:root{
-  --btn-bg-color: #479FF8;
-  --btn-txt-color: #ffffff;
-  --btn-hover-color: #0a58ca;
-  --pills-bg-color: #479FF8;
-  --pills-txt-color: None;
-  --links-txt-color: #479FF8;
-  --links-hover-color: #88b9ea;
-  --btn-success: #821e27;
-  --btn-success-txt: #821e27;
-  --btn-success-hover: #821e27;
-  --btn-danger: #821e27;
-  --btn-danger-txt: #821e27;
-  --btn-danger-hover: #821e27;
-  --primary: #479FF8;
-}
-
-.text-primary {
-  color: var(--primary) !important;
-}
-
-.btn-primary {
-  background-color: var(--btn-bg-color);
-  color: var(--btn-txt-color);
-  border-color: var(--btn-bg-color);
-}
-
-.btn-outline-primary {
-  border-color: var(--btn-bg-color);
-  color: var(--btn-bg-color);
-}
-
-.btn-primary:hover, .btn-outline-primary:hover{
-  background-color: var(--btn-hover-color);
-  border-color: var(--btn-hover-color);
-}
-
-.nav-pills .nav-link.active, .nav-pills .show>.nav-link{
-  background-color: var(--pills-bg-color);
-  color: var(--pills-txt-color);
-}
-
-a{
- color: var(--links-txt-color); 
-}
-
-.link img {
-  color: var(--links-txt-color); 
-}
-
-a:hover{
-  color:var(--links-hover-color)
-}
-
-.nav-link{
-  color: var(--links-txt-color)
-}
-
-.nav-link:hover{
-  color:var(--links-hover-color)
-}
-
-.btn-success, .btn-outline-success{
-  color: var(--btn-txt-color);
-  background-color: var(--btn-success);
-  border-color: var(--btn-success);
-}
-
-.btn-success:hover, .btn-outline-success:hover{
-  background-color: var(--btn-success-hover);
-  border-color: var(--btn-success-hover);
-}
-
-.btn-danger, .btn-outline-danger{
-  color: var(--btn-danger-txt);
-  background-color: var(--btn-danger);
-  border-color: var(--btn-danger);
-}
-
-.btn-danger:hover, .btn-outline-danger:hover{
-  background-color: var(--btn-danger-hover);
-  border-color: var(--btn-danger-hover);
-}
-

+ 0 - 94
sharix_admin/static/drf-yasg/service_type.css

@@ -1,94 +0,0 @@
-
-
-h1.mainHeader {
-    font-weight: 700;
-    font-size: 28px;
-}
-p.description_service {
-    text-align: start;
-    font-size: 14px;
-    line-height: 24px;
-    font-weight: 400;
-    color: #7E7E7E;
-    letter-spacing: 0.14px;
-    margin-top: 14px;
-}
-
-
-table.table thead th.orderable {
-    background: url('service_type/arrow_fil.svg') no-repeat center right;
-}
-table.table thead th.asc {
-    background: url('service_type/arrow_asc.svg') no-repeat center right;
-}
-table.table thead th.desc {
-    background: url('service_type/arrow_desc.svg') no-repeat center right;
-}
-
-.delete_col {
-    background-image: url('service_type/delete.svg');
-    background-position: center right;
-    background-repeat: no-repeat;
-}
-.delete_col a {
-    color: transparent;
-    line-height: 24px;
-}
-.delete_col a:hover {
-    color: transparent;
-}
-
-.edit_col a {
-    color: transparent;
-}
-.edit_col a:hover {
-    color: transparent;
-}
-.edit_col{
-    background: url('service_type/pencil.svg') no-repeat center right;
-}
-
-
-.description_col {
-    overflow: hidden;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-    max-width: 610px;
-    justify-content: center;
-    &:hover {
-        white-space: normal;
-}
-}
-
-
-table.table thead th {
-    border: 1px #ffffff;
-}
-.description_col-active {
-    border: 1px #95C0F6;
-}
-.test {
-    width: 50px;
-    height: 50px;
-    margin-left: 30px;
-    background-color: #95C0F6;
-}
-
-table.table {
-    border-spacing: 0;
-}
-
-table.table tbody tr:hover {
-    box-shadow: 0px 0px 0px 1.5px #95C0F6;
-    border-radius: 10px;
-    border-top: transparent;
-    border-bottom: transparent;
-    border-left: transparent;
-    border-right: transparent;
-}
-
-#bord {
-    background-color: #479FF8;
-    color: #ffffff;
-}
-

+ 0 - 3
sharix_admin/static/drf-yasg/service_type/arrow_asc.svg

@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
-  <path d="M6.29 12.7101L11.29 17.7101C11.3851 17.8011 11.4972 17.8725 11.62 17.9201C11.8635 18.0201 12.1365 18.0201 12.38 17.9201C12.5027 17.8725 12.6149 17.8011 12.71 17.7101L17.71 12.7101C17.8032 12.6169 17.8772 12.5062 17.9277 12.3844C17.9781 12.2625 18.0041 12.132 18.0041 12.0001C18.0041 11.7338 17.8983 11.4784 17.71 11.2901C17.5217 11.1018 17.2663 10.996 17 10.996C16.7337 10.996 16.4783 11.1018 16.29 11.2901L13 14.5901L13 7.0001C13 6.73489 12.8946 6.48053 12.7071 6.293C12.5196 6.10546 12.2652 6.0001 12 6.0001C11.7348 6.0001 11.4804 6.10546 11.2929 6.293C11.1054 6.48053 11 6.73489 11 7.0001L11 14.5901L7.71 11.2901C7.61703 11.1964 7.50644 11.122 7.38458 11.0712C7.26272 11.0204 7.13201 10.9943 7 10.9943C6.86799 10.9943 6.73728 11.0204 6.61542 11.0712C6.49356 11.122 6.38296 11.1964 6.29 11.2901C6.19627 11.3831 6.12188 11.4937 6.07111 11.6155C6.02034 11.7374 5.9942 11.8681 5.9942 12.0001C5.9942 12.1321 6.02034 12.2628 6.07111 12.3847C6.12188 12.5065 6.19627 12.6171 6.29 12.7101Z" fill="#202020"/>
-</svg>

+ 0 - 3
sharix_admin/static/drf-yasg/service_type/arrow_desc.svg

@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
-  <path d="M17.71 11.29L12.71 6.29002C12.6149 6.19898 12.5028 6.12761 12.38 6.08002C12.1365 5.98 11.8635 5.98 11.62 6.08002C11.4973 6.12761 11.3851 6.19898 11.29 6.29002L6.29 11.29C6.19676 11.3833 6.1228 11.4939 6.07234 11.6158C6.02188 11.7376 5.99591 11.8682 5.99591 12C5.99591 12.2663 6.1017 12.5217 6.29 12.71C6.47831 12.8983 6.7337 13.0041 7 13.0041C7.2663 13.0041 7.5217 12.8983 7.71 12.71L11 9.41002L11 17C11 17.2652 11.1054 17.5196 11.2929 17.7071C11.4804 17.8947 11.7348 18 12 18C12.2652 18 12.5196 17.8947 12.7071 17.7071C12.8946 17.5196 13 17.2652 13 17L13 9.41002L16.29 12.71C16.383 12.8037 16.4936 12.8781 16.6154 12.9289C16.7373 12.9797 16.868 13.0058 17 13.0058C17.132 13.0058 17.2627 12.9797 17.3846 12.9289C17.5064 12.8781 17.617 12.8037 17.71 12.71C17.8037 12.6171 17.8781 12.5065 17.9289 12.3846C17.9797 12.2627 18.0058 12.132 18.0058 12C18.0058 11.868 17.9797 11.7373 17.9289 11.6154C17.8781 11.4936 17.8037 11.383 17.71 11.29Z" fill="#202020"/>
-</svg>

+ 0 - 3
sharix_admin/static/drf-yasg/service_type/arrow_fil.svg

@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
-  <path d="M6.29 12.7101L11.29 17.7101C11.3851 17.8011 11.4972 17.8725 11.62 17.9201C11.8635 18.0201 12.1365 18.0201 12.38 17.9201C12.5027 17.8725 12.6149 17.8011 12.71 17.7101L17.71 12.7101C17.8032 12.6169 17.8772 12.5062 17.9277 12.3844C17.9781 12.2625 18.0041 12.132 18.0041 12.0001C18.0041 11.7338 17.8983 11.4784 17.71 11.2901C17.5217 11.1018 17.2663 10.996 17 10.996C16.7337 10.996 16.4783 11.1018 16.29 11.2901L13 14.5901L13 7.0001C13 6.73489 12.8946 6.48053 12.7071 6.293C12.5196 6.10546 12.2652 6.0001 12 6.0001C11.7348 6.0001 11.4804 6.10546 11.2929 6.293C11.1054 6.48053 11 6.73489 11 7.0001L11 14.5901L7.71 11.2901C7.61703 11.1964 7.50644 11.122 7.38458 11.0712C7.26272 11.0204 7.13201 10.9943 7 10.9943C6.86799 10.9943 6.73728 11.0204 6.61542 11.0712C6.49356 11.122 6.38296 11.1964 6.29 11.2901C6.19627 11.3831 6.12188 11.4937 6.07111 11.6155C6.02034 11.7374 5.9942 11.8681 5.9942 12.0001C5.9942 12.1321 6.02034 12.2628 6.07111 12.3847C6.12188 12.5065 6.19627 12.6171 6.29 12.7101Z" fill="#202020"/>
-</svg>

+ 0 - 3
sharix_admin/static/drf-yasg/service_type/delete.svg

@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="25" height="24" viewBox="0 0 25 24" fill="none">
-  <path d="M10.5 18C10.7652 18 11.0196 17.8946 11.2071 17.7071C11.3946 17.5196 11.5 17.2652 11.5 17V11C11.5 10.7348 11.3946 10.4804 11.2071 10.2929C11.0196 10.1054 10.7652 10 10.5 10C10.2348 10 9.98043 10.1054 9.79289 10.2929C9.60536 10.4804 9.5 10.7348 9.5 11V17C9.5 17.2652 9.60536 17.5196 9.79289 17.7071C9.98043 17.8946 10.2348 18 10.5 18ZM20.5 6H16.5V5C16.5 4.20435 16.1839 3.44129 15.6213 2.87868C15.0587 2.31607 14.2956 2 13.5 2H11.5C10.7044 2 9.94129 2.31607 9.37868 2.87868C8.81607 3.44129 8.5 4.20435 8.5 5V6H4.5C4.23478 6 3.98043 6.10536 3.79289 6.29289C3.60536 6.48043 3.5 6.73478 3.5 7C3.5 7.26522 3.60536 7.51957 3.79289 7.70711C3.98043 7.89464 4.23478 8 4.5 8H5.5V19C5.5 19.7956 5.81607 20.5587 6.37868 21.1213C6.94129 21.6839 7.70435 22 8.5 22H16.5C17.2956 22 18.0587 21.6839 18.6213 21.1213C19.1839 20.5587 19.5 19.7956 19.5 19V8H20.5C20.7652 8 21.0196 7.89464 21.2071 7.70711C21.3946 7.51957 21.5 7.26522 21.5 7C21.5 6.73478 21.3946 6.48043 21.2071 6.29289C21.0196 6.10536 20.7652 6 20.5 6ZM10.5 5C10.5 4.73478 10.6054 4.48043 10.7929 4.29289C10.9804 4.10536 11.2348 4 11.5 4H13.5C13.7652 4 14.0196 4.10536 14.2071 4.29289C14.3946 4.48043 14.5 4.73478 14.5 5V6H10.5V5ZM17.5 19C17.5 19.2652 17.3946 19.5196 17.2071 19.7071C17.0196 19.8946 16.7652 20 16.5 20H8.5C8.23478 20 7.98043 19.8946 7.79289 19.7071C7.60536 19.5196 7.5 19.2652 7.5 19V8H17.5V19ZM14.5 18C14.7652 18 15.0196 17.8946 15.2071 17.7071C15.3946 17.5196 15.5 17.2652 15.5 17V11C15.5 10.7348 15.3946 10.4804 15.2071 10.2929C15.0196 10.1054 14.7652 10 14.5 10C14.2348 10 13.9804 10.1054 13.7929 10.2929C13.6054 10.4804 13.5 10.7348 13.5 11V17C13.5 17.2652 13.6054 17.5196 13.7929 17.7071C13.9804 17.8946 14.2348 18 14.5 18Z" fill="#EF3232"/>
-</svg>

+ 0 - 3
sharix_admin/static/drf-yasg/service_type/pencil.svg

@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="25" height="24" viewBox="0 0 25 24" fill="none">
-  <path d="M22.5 7.24002C22.5008 7.10841 22.4756 6.97795 22.4258 6.85611C22.376 6.73427 22.3027 6.62346 22.21 6.53002L17.97 2.29002C17.8766 2.19734 17.7658 2.12401 17.6439 2.07425C17.5221 2.02448 17.3916 1.99926 17.26 2.00002C17.1284 1.99926 16.9979 2.02448 16.8761 2.07425C16.7543 2.12401 16.6435 2.19734 16.55 2.29002L13.72 5.12002L2.79002 16.05C2.69734 16.1435 2.62401 16.2543 2.57425 16.3761C2.52448 16.4979 2.49926 16.6284 2.50002 16.76V21C2.50002 21.2652 2.60537 21.5196 2.79291 21.7071C2.98045 21.8947 3.2348 22 3.50002 22H7.74002C7.87994 22.0076 8.01991 21.9857 8.15084 21.9358C8.28176 21.8858 8.40073 21.8089 8.50002 21.71L19.37 10.78L22.21 8.00002C22.3013 7.9031 22.3757 7.79155 22.43 7.67002C22.4397 7.59031 22.4397 7.50973 22.43 7.43002C22.4347 7.38347 22.4347 7.33657 22.43 7.29002L22.5 7.24002ZM7.33002 20H4.50002V17.17L14.43 7.24002L17.26 10.07L7.33002 20ZM18.67 8.66002L15.84 5.83002L17.26 4.42002L20.08 7.24002L18.67 8.66002Z" fill="#479FF8"/>
-</svg>

+ 0 - 52
sharix_admin/static/drf-yasg/style.css

@@ -1,52 +0,0 @@
-.hidden {
-    display: none;
-}
-
-#django-session-auth > div {
-    display: inline-block;
-}
-
-#django-session-auth .btn.authorize {
-    padding: 10px 23px;
-}
-
-#django-session-auth .btn.authorize a {
-    color: #49cc90;
-    text-decoration: none;
-}
-
-#django-session-auth .hello {
-    margin-right: 5px;
-}
-
-#django-session-auth .hello .django-session {
-    font-weight: bold;
-}
-
-.label {
-    display: inline;
-    padding: .2em .6em .3em;
-    font-weight: 700;
-    line-height: 1;
-    color: #fff;
-    text-align: center;
-    white-space: nowrap;
-    vertical-align: baseline;
-    border-radius: .25em;
-}
-
-.label-primary {
-    background-color: #337ab7;
-}
-
-.divider {
-    margin-right: 8px;
-    background: #16222c44;
-    width: 2px;
-}
-
-svg.swagger-defs {
-    position: absolute;
-    width: 0;
-    height: 0;
-}

+ 89 - 2
sharix_admin/static/sharix_admin/css/style.css → sharix_admin/static/sharix_admin/css/base.css

@@ -1,5 +1,22 @@
 @import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700&display=swap');
 
+:root{
+    --btn-bg-color: #479FF8;
+    --btn-txt-color: #ffffff;
+    --btn-hover-color: #0a58ca;
+    --pills-bg-color: #479FF8;
+    --pills-txt-color: None;
+    --links-txt-color: #479FF8;
+    --links-hover-color: #88b9ea;
+    --btn-success: #821e27;
+    --btn-success-txt: #821e27;
+    --btn-success-hover: #821e27;
+    --btn-danger: #821e27;
+    --btn-danger-txt: #821e27;
+    --btn-danger-hover: #821e27;
+    --primary: #479FF8;
+}
+
 * {
     font-family: 'Open Sans', sans-serif;
     margin: 0;
@@ -7,6 +24,77 @@
     box-sizing: border-box;
 }
 
+p {
+    color: var(--bs-secondary-color);
+}
+
+.text-primary {
+    color: var(--primary) !important;
+}
+
+.btn-primary {
+    background-color: var(--btn-bg-color);
+    color: var(--btn-txt-color);
+    border-color: var(--btn-bg-color);
+}
+
+.btn-outline-primary {
+    border-color: var(--btn-bg-color);
+    color: var(--btn-bg-color);
+}
+
+.btn-primary:hover, .btn-outline-primary:hover {
+    background-color: var(--btn-hover-color);
+    border-color: var(--btn-hover-color);
+}
+
+.nav-pills .nav-link.active, .nav-pills .show > .nav-link {
+    background-color: var(--pills-bg-color);
+    color: var(--pills-txt-color);
+}
+
+a {
+    color: var(--links-txt-color); 
+}
+
+.link img {
+    color: var(--links-txt-color); 
+}
+
+a:hover {
+    color:var(--links-hover-color);
+}
+
+.nav-link{
+    color: var(--links-txt-color);
+}
+
+.nav-link:hover{
+    color:var(--links-hover-color);
+}
+
+.btn-success, .btn-outline-success{
+    color: var(--btn-txt-color);
+    background-color: var(--btn-success);
+    border-color: var(--btn-success);
+}
+
+.btn-success:hover, .btn-outline-success:hover{
+    background-color: var(--btn-success-hover);
+    border-color: var(--btn-success-hover);
+}
+
+.btn-danger, .btn-outline-danger{
+    color: var(--btn-danger-txt);
+    background-color: var(--btn-danger);
+    border-color: var(--btn-danger);
+}
+
+.btn-danger:hover, .btn-outline-danger:hover{
+    background-color: var(--btn-danger-hover);
+    border-color: var(--btn-danger-hover);
+}
+
 .content {
     max-width: 1920px;
     min-width: 800px;
@@ -178,5 +266,4 @@
   
 .drop-container  input[type=file]::file-selector-button:hover {
     background: var(--btn-hover-color);
-}
-  
+}

+ 1 - 3
sharix_admin/templates/sharix_admin/base.html

@@ -10,9 +10,7 @@
     <link rel="stylesheet" href="{% static 'fontawesomefree/css/fontawesome.css' %}">
     <link rel="stylesheet" href="{% static 'fontawesomefree/css/brands.css' %}">
     
-    <link rel="stylesheet" href="{% static 'drf-yasg/service_type.css' %}">
-    <link rel="stylesheet" href="{% static 'drf-yasg/colors2.css' %}">
-    <link rel="stylesheet" href="{% static 'sharix_admin/css/style.css' %}">
+    <link rel="stylesheet" href="{% static 'sharix_admin/css/base.css' %}">
     
     <link rel="icon" href="{% static 'sharix_admin/img/favicon.ico' %}" type="image/x-icon">
     <title>

+ 26 - 25
sharix_admin/templates/sharix_admin/index.html → sharix_admin/templates/sharix_admin/base_admin.html

@@ -15,12 +15,12 @@
 
     <ul class="d-flex flex-column nav nav-pills rounded box-shadow border p-2 bg-white">
       <li class="nav-item">
-        <a href="{% url "sharix_admin:home" %}" class="nav-link {% if current_page == "index" %}active rounded{% endif %}">
+        <a href="{% url "sharix_admin:main" %}" class="nav-link {% if current_page == "main" %}active rounded{% endif %}">
           <div class="link d-flex align-items-center">
             <img
               class="nav-img"
               src="
-                {% if current_page == "index" %}
+                {% if current_page == "main" %}
                   {% static 'sharix_admin/img/menu/house_w.svg' %}
                 {% else %}
                   {% static 'sharix_admin/img/menu/house.svg' %}
@@ -59,7 +59,7 @@
           </div>
         </a>
       </li>
-      <li class="nav-item">
+      {% comment %} <li class="nav-item">
         <a href="{% url "sharix_admin:partners" %}" class="nav-link {% if current_page == "partners" %}active rounded{% endif %}">
           <div class="link d-flex align-items-center">
             <img
@@ -73,8 +73,8 @@
             <span class="menu-bar-label">Партнеры</span>
           </div>
         </a>
-      </li>
-      {% if not is_partner_admin %}
+      </li> {% endcomment %}
+      {% if not "PARTNER-ADMIN" in user_groups %}
         <li class="nav-item">
           <a href="{% url "sharix_admin:cooperate" %}" class="nav-link {% if current_page == "cooperate" %}active rounded{% endif %}">
             <div class="link d-flex align-items-center">
@@ -106,7 +106,7 @@
           </div>
         </a>
       </li> {% endcomment %}
-      <li class="nav-item">
+      {% comment %} <li class="nav-item">
         <a href="{% url 'sharix_admin:service_type' %}" class="nav-link {% if current_page == "service_type" %}active rounded{% endif %}">
           <div class="link d-flex align-items-center">
             <img
@@ -120,8 +120,8 @@
             <span class="menu-bar-label">Услуги сервиса</span>
           </div>
         </a>
-      </li>
-      <li class="nav-item">
+      </li> {% endcomment %}
+      {% comment %} <li class="nav-item">
         <a href="{% url 'sharix_admin:transactions' %}" class="nav-link {% if current_page == "transactions" %}active rounded{% endif %}">
           <div class="link d-flex align-items-center">
             <img
@@ -135,8 +135,8 @@
             <span class="menu-bar-label">История заказов</span>
           </div>
         </a>
-      </li>
-      {% if is_partner_admin %}
+      </li> {% endcomment %}
+      {% if "PARTNER-ADMIN" in user_groups %}
         <li class="nav-item">
           <a href="{% url 'sharix_admin:partner_detail' %}" class="nav-link {% if current_page == 'partner' %}active rounded{% endif %}">
             <div class="link d-flex align-items-center">
@@ -168,7 +168,7 @@
           </div>
         </a>
       </li> {% endcomment %}
-      <li class="nav-item">
+      {% comment %} <li class="nav-item">
         <a href="{% url 'sharix_admin:payment' %}" class="nav-link {% if current_page == "payment" %}active rounded{% endif %}">
           <div class="link d-flex align-items-center">
             <img
@@ -179,21 +179,22 @@
                 {% else %}
                   {% static 'sharix_admin/img/menu/credit-card.svg' %}
                 {% endif %}">
-            <span class="menu-bar-label">Оплата</span>
+            <span class="menu-bar-label">Реквизиты</span>
           </div>
         </a>
-      </li>
+      </li> {% endcomment %}
     </ul>
   </nav>
 
   <div id="user-workspace" class="p-5 border rounded box-shadow">
-      <h1 class="mainHeader mb-3">{{ title }}</h1>
+      <h1>{{ title }}</h1>
       {% if messages %}
         {% for message in messages %}
           <div class="alert {% if message.tags %}alert-{{ message.tags }}{% endif %}">{{ message }}</div>
         {% endfor %}
       {% endif %}
-      {% block contenthome %}{% endblock contenthome%}
+      
+      {% block view %}{% endblock view %}
   </div>
 
   <footer class="d-flex justify-content-between mt-3 p-2 align-items-center border rounded box-shadow">
@@ -201,23 +202,23 @@
         <div class="d-flex justify-content-center align-items-center rounded-circle bg-secondary-subtle p-3">
           <i class="fa-solid fa-user"></i>
         </div>
-        <span class="mx-2 text-nowrap">{{ phone }}</span>
-        
-        <form method="post" action="{% url "sharix_admin:auth_logout" %}">
-          {% csrf_token %}
-          <button class="btn btn-sm btn-outline-secondary" type="submit">
-            Выйти
-            <i class="fa-solid fa-right-from-bracket ms-1"></i>
-          </button>
-        </form>
+        <span class="mx-2 text-nowrap text-muted">{{ user }}</span>
     </div>
 
-    <div class="d-flex gap-3">
+    <div class="d-flex gap-3 mx-2">
         <a href="{% url 'contact' %}">{% trans 'Contacts' %}</a>
         <a href="https://wiki.sharix-app.org/doku.php/sharix/legal/soglashenie_s_servisom_na_ispolzovanie_platformy_sharix">{% trans 'Terms of use' %}</a>
         <a href="https://wiki.sharix-app.org/doku.php/sharix/legal/politika_konfidencialnosti_platformy_sharix">{% trans 'Privacy policy' %}</a>
         <a href="https://wiki.sharix-app.org/doku.php">Помощь</a>
     </div>
+
+    <form method="post" action="{% url "sharix_admin:auth_logout" %}">
+      {% csrf_token %}
+      <button class="btn btn-sm btn-outline-secondary text-nowrap" type="submit">
+        Выйти
+        <i class="fa-solid fa-right-from-bracket ms-1"></i>
+      </button>
+    </form>
   </footer>
 </div>
 

+ 2 - 3
sharix_admin/templates/sharix_admin/cooperate.html

@@ -1,7 +1,6 @@
-{% extends 'sharix_admin/index.html' %}
+{% extends 'sharix_admin/base_admin.html' %}
 
-{% block contenthome %}
-<p class="description_service">Товарищи! Консультация с широким активом требуют определения и уточнения существенных финансовых и административных условий. Идейные соображения высшего порядка, а также постоянный количественный рост и сфера нашей активности обеспечивает широкому кругу (специалистов) участие в формировании форм развития. </p>
+{% block view %}
 <form method="post" class="d-flex flex-column align-items-end">
     {% csrf_token %}
     {% include 'sharix_admin/include/form.html' %}

+ 70 - 33
sharix_admin/templates/sharix_admin/main.html

@@ -1,37 +1,74 @@
-{% extends 'sharix_admin/index.html' %}
-{% load i18n %}
-
-{% block contenthome %}
-<p class="description_service">Это система управления государством, источником власти в которой является сам народ. Именно народ решает, какие законы и нормы необходимы для гармоничного существования и развития государства. Таким образом, каждый человек в демократическом обществе 
-    Получает определенный набор свобод и обязательств сформированных с учетом интересов всего сообщества. Исходя из вышесказанного, можно заключить, что демократия – это возможность для каждого человека свободно участвовать в непосредственном управлении своим государством, обществом и личной судьбой в конечном счете.</p>    
-<div class="container" style="padding: 2px;">
-    <div class="row fs-6">
-        
-        <div class="col-6 ">
-            <ul class="list-group">
-                <li class="list-group-item light"><strong>{% trans 'Documentation' %}</strong> </li>
-                <li class="list-group-item"><a  href="https://wiki.sharix-app.org/doku.php/sharix/legal/politika_konfidencialnosti_platformy_sharix">{% trans 'Privacy policy' %}</a></li>
-                <li class="list-group-item"><a  href="https://wiki.sharix-app.org/doku.php/sharix/legal/pravila_okazanija_uslug">{% trans 'Rules for the provision of services' %}</a></li>
-                <li class="list-group-item"><a  href="https://wiki.sharix-app.org/doku.php/sharix/legal/porjadok_okazanija_uslug">{% trans 'Procedure for the provision of services' %}</a></li>
-                <li class="list-group-item"><a  href="https://wiki.sharix-app.org/doku.php/sharix/legal/perechen_uslug_platformy">{% trans 'List of services' %}</a></li>
-                <li class="list-group-item"><a  href="{% url 'sharix_admin:schemav1' %}">{% trans 'Scheme 1' %}</a> / <a  href="{% url 'sharix_admin:schemav2' %}">{% trans 'Scheme 2' %}</a> / <a  href="{% url 'sharix_admin:schema' %}">{% trans 'Scheme 3' %}</a> / <a  href="{% url 'sharix_admin:schema-redoc' %}">{% trans 'API Docs' %}</a></li>
-            </ul>
+{% extends 'sharix_admin/base_admin.html' %}
+
+{% block view %}
+<p>
+    {{ user }}, приветствуем в личном кабинете сервиса ShariX Open!
+
+    <!-- FIXME: Сменить адрес ссылки -->
+    <a href="#" class="text-nowrap">Личный кабинет ShariX Platform</a>
+</p>
+
+{% if "CLIENT" in user_groups %}
+    <div class="card mb-5">
+        <div class="card-body d-flex justify-content-between align-items-center">
+            <span>Баланс: 0 <i class="fa-solid fa-coins me-1"></i></span>
+            <!-- FIXME: Сменить адрес ссылки -->
+            <a href="#" class="btn btn btn-primary disabled">
+                Пополнить
+            </a>
+        </div>
+    </div>
+{% endif %}
+
+<div class="row row-cols-1 row-cols-md-2 g-4">
+    <div class="col">
+        <h2>Доступные группы</h2>
+        <div class="my-3">
+            {% for group in user_groups %}
+                <span class="badge rounded-pill text-bg-primary">{{ group }}</span>
+            {% empty %}
+                <p class="opacity-50 m-0">Вы пока еще не добавлены ни в одну группу</p>
+            {% endfor %}
         </div>
-        <div class="col-6 text-end">
-            {% blocktrans trimmed with request.user.username as user %}
-            <p>User: <b>{{ user }}</b></p>
-            {% endblocktrans %}
-            {% blocktrans trimmed %}
-            <p>Phone number: <b>{{ phone }}</b></p>
-            {% endblocktrans %}
-            {% blocktrans trimmed with request.user.date_joined as date %}
-            <p>Date of registration: <b>{{ date }}</b></p>
-            {% endblocktrans %}
-            {% blocktrans trimmed with wallet.balance as balance %}
-            <p>Balance: <b>{{ balance }} points</b></p>
-            {% endblocktrans %}
-            <a href="{% url 'sharix_admin:balance' %}" class="btn btn-success">{% trans 'Buy points' %}</a>
+
+        <div class="d-flex flex-wrap gap-1 text-nowrap mt-2">
+            <!-- FIXME: Сменить адрес ссылки -->
+            <a href="#" class="btn btn-sm btn-primary disabled">
+                <i class="fa-solid fa-people-group me-1"></i>
+                Стать частью команды
+            </a>
+            {% if not "PARTNER-ADMIN" in user_groups %}
+                <a href="{% url "sharix_admin:cooperate" %}" class="btn btn-sm btn-primary">
+                    <i class="fa-solid fa-handshake me-1"></i>
+                    Стать партнером
+                </a>
+            {% endif %}
         </div>
     </div>
-</div>  
+    <div class="col">
+        <h2>Документация</h2>
+        <ul>
+            <!-- FIXME: Сменить адреса всех ссылок -->
+            <li><a href="https://wiki.sharix-app.org/doku.php/sharix/legal/politika_konfidencialnosti_platformy_sharix">Политика конфиденциальности</a></li>
+            <li><a href="https://wiki.sharix-app.org/doku.php/sharix/legal/pravila_okazanija_uslug">Правила оказания услуг</a></li>
+            <li><a href="https://wiki.sharix-app.org/doku.php/sharix/legal/porjadok_okazanija_uslug">Пользовательское соглашение с пользователями</a></li>
+
+            {% if "PARTNER-ADMIN" in user_groups %}
+                <li><a href="https://wiki.sharix-app.org/doku.php/sharix/legal/porjadok_okazanija_uslug">Пользовательское соглашение с партнерами</a></li>
+            {% endif %}
+
+            {% if "CLIENT" in user_groups %}
+                <li><a href="https://wiki.sharix-app.org/doku.php/sharix/legal/porjadok_okazanija_uslug">Договор на оказание услуг</a></li>
+            {% endif %}
+
+            {% if "PARTNER-ADMIN" in user_groups or "METASERVICE-ADMIN" in user_groups %}
+                <li><a href="https://wiki.sharix-app.org/doku.php/sharix/legal/porjadok_okazanija_uslug">Договор оказания посреднических услуг (с платформой)</a></li>
+            {% endif %}
+
+            {% if "METASERVICE-TECHSUPPORT" in user_groups %}
+                <li><a href="{% url 'sharix_admin:schemav1' %}">Схема 1</a> / <a  href="{% url 'sharix_admin:schemav2' %}">Схема 2</a> / <a  href="{% url 'sharix_admin:schema' %}">Схема 3</a> / <a  href="{% url 'sharix_admin:schema-redoc' %}">API</a></li>
+            {% endif %}
+        </ul>
+    </div>
+</div>
 {% endblock %}

+ 6 - 7
sharix_admin/templates/sharix_admin/partner.html

@@ -1,8 +1,7 @@
-{% extends 'sharix_admin/index.html' %}
-{% load i18n %}
+{% extends 'sharix_admin/base_admin.html' %}
 {% load static %}
 
-{% block contenthome %}
+{% block view %}
 <p class="description_service">
     Это система управления государством, источником власти в которой является сам народ. Именно народ решает, какие законы и нормы необходимы для гармоничного существования и развития государства. Таким образом, каждый человек в демократическом обществе 
     Получает определенный набор свобод и обязательств сформированных с учетом интересов всего сообщества. Исходя из вышесказанного, можно заключить, что демократия – это возможность для каждого человека свободно участвовать в непосредственном управлении своим государством, обществом и личной судьбой в конечном счете
@@ -27,7 +26,7 @@
             <li><b>Банк</b> {{ company.bank_name }}</li>
         </ul>
     </div>
-    <a class="btn btn-primary btn-edit" href="{% url "partner_edit" %}">
+    <a class="btn btn-primary btn-edit" href="{% url "sharix_admin:partner_edit" %}">
         <img src="{% static 'sharix_admin/img/pencil.svg' %}">
     </a>
 </div>
@@ -49,11 +48,11 @@
                 </div>
                 
                 {% if doc.ticket_status %}
-                    <a class="btn btn-sm btn-outline-primary" href="{% url "partner_doc" doc.doc_type %}">Посмотреть</a>
+                    <a class="btn btn-sm btn-outline-primary" href="{% url "sharix_admin:partner_doc" doc.doc_type %}">Посмотреть</a>
                 {% else %}
-                    <a class="btn btn-sm btn-primary" href="{% url "partner_doc_upload" doc.doc_type %}">Загрузить</a>
+                    <a class="btn btn-sm btn-primary" href="{% url "sharix_admin:partner_doc_upload" doc.doc_type %}">Загрузить</a>
                 {% endif %}
             </li>
         {% endfor %}
     </ul>
-{% endblock contenthome %}
+{% endblock %}

+ 5 - 7
sharix_admin/templates/sharix_admin/partner/doc.html

@@ -1,10 +1,8 @@
-{% extends 'sharix_admin/index.html' %}
-{% load i18n %}
+{% extends 'sharix_admin/base_admin.html' %}
 {% load static %}
 
-
-{% block contenthome %}
-<a class="display-block btn btn-sm btn-outline-secondary" href="{% url 'partner_detail' %}"><< Назад</a>
+{% block view %}
+<a class="display-block btn btn-sm btn-outline-secondary" href="{% url 'sharix_admin:partner_detail' %}"><< Назад</a>
 
 <h5 class="my-3">Общая информация</h6>
 
@@ -22,5 +20,5 @@
     {% endfor %}
 </ul>  
 
-<a class="btn btn-primary" href="{% url "partner_doc_upload" doc.doc_type %}">Загрузить новые файлы</a>
-{% endblock contenthome %}
+<a class="btn btn-primary" href="{% url "sharix_admin:partner_doc_upload" doc.doc_type %}">Загрузить новые файлы</a>
+{% endblock %}

+ 4 - 5
sharix_admin/templates/sharix_admin/partner/doc_upload.html

@@ -1,10 +1,9 @@
-{% extends 'sharix_admin/index.html' %}
-{% load i18n %}
+{% extends 'sharix_admin/base_admin.html' %}
 {% load static %}
 
 
-{% block contenthome %}
-<a class="display-block btn btn-sm btn-outline-secondary" href="{% url 'partner_detail' %}"><< Назад</a>
+{% block view %}
+<a class="display-block btn btn-sm btn-outline-secondary" href="{% url 'sharix_admin:partner_detail' %}"><< Назад</a>
 
 <p class="description_service">
     Это система управления государством, источником власти в которой является сам народ. Именно народ решает, какие законы и нормы необходимы для гармоничного существования и развития государства.
@@ -86,4 +85,4 @@
         });
     });
 </script>
-{% endblock contenthome %}
+{% endblock %}

+ 4 - 6
sharix_admin/templates/sharix_admin/partner_edit.html

@@ -1,10 +1,8 @@
-{% extends 'sharix_admin/index.html' %}
-{% load i18n %}
+{% extends 'sharix_admin/base_admin.html' %}
 {% load static %}
 
-{% block contenthome %}
-
-<a class="display-block btn btn-sm btn-outline-secondary" href="{% url 'partner_detail' %}"><< Назад</a>
+{% block view %}
+<a class="display-block btn btn-sm btn-outline-secondary" href="{% url 'sharix_admin:partner_detail' %}"><< Назад</a>
 
 <p class="description_service">
     Это система управления государством, источником власти в которой является сам народ. Именно народ решает, какие законы и нормы необходимы для гармоничного существования и развития государства. Таким образом, каждый человек в демократическом обществе 
@@ -35,4 +33,4 @@
         </div>
     </div>
 </form>
-{% endblock contenthome %}
+{% endblock %}

+ 4 - 3
sharix_admin/urls.py

@@ -22,10 +22,11 @@ urlpatterns = [
     path('auth/logout/', login_required(LogoutView.as_view()), name="auth_logout"),
     path('auth/reset-password/', ShariXResetPasswordView.as_view(), name='auth_reset_password'),
 
-    # --- Ниже страницы, которые требуют ревью ---
-
     # Главная
-    path('', login_required(IndexView.as_view()), name='home'),
+    path('', login_required(MainView.as_view()), name='main'),
+    
+    # --- Ниже страницы, требующие ревью ---
+
     path('transactions/', login_required(TransactionsView.as_view()), name='transactions'),
     path('payment/', login_required(PaymentView.as_view()), name='payment'),
     

+ 1 - 1
sharix_admin/views/__init__.py

@@ -1,6 +1,6 @@
 from .auth import *
+from .main import *
 
-from .index import *
 from .transactions import *
 from .service import *
 from .partner import *

+ 10 - 2
sharix_admin/views/base.py

@@ -1,20 +1,28 @@
 from django.views import View
+from django.contrib.auth.mixins import UserPassesTestMixin
 
 
-class BaseView(View):
+class BaseView(UserPassesTestMixin, View):
     """
     Базовый класс представления админ-панели ShariX.
 
     Предоставляет общие методы и функционал, который
     может быть использован в других представлениях админ-панели.
     """
+    def dispatch(self, request, *args, **kwargs):
+        self.user_groups = self.request.user.groups.values_list('name', flat=True)
+        return super().dispatch(request, *args, **kwargs)
+
+    def test_func(self):
+        return True
+
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
 
         context.update({
             'title': self.page_title,
             'current_page': self.page_name,
-            'is_partner_admin': self.request.user.groups.filter(name='PARTNER-ADMIN').exists()
+            'user_groups': self.user_groups
         })
         
         return context

+ 7 - 12
sharix_admin/views/cooperate.py

@@ -2,7 +2,6 @@ from datetime import datetime, timedelta
 
 from django.views.generic.edit import FormView
 from django.urls import reverse_lazy
-from django.contrib.auth.mixins import UserPassesTestMixin
 from django.contrib import messages
 from django.db import transaction
 
@@ -11,15 +10,19 @@ from sharix_admin.utils import create_ticket_partner_activation
 from dbsynce.models import Documents
 from tickets.models import Ticket, TicketList
 
+from .base import BaseView
 
-class CooperateView(UserPassesTestMixin, FormView):
+
+class CooperateView(BaseView, FormView):
     form_class = CompanyForm
     template_name = "sharix_admin/cooperate.html"
-    success_url = reverse_lazy("home")
+    success_url = reverse_lazy("sharix_admin:main")
+    page_title = 'Сотрудничество'
+    page_name = 'cooperate'
 
     # Проверяем не состояит ли текущий пользователь в группе PARTNER-ADMIN
     def test_func(self):
-        return not self.request.user.groups.filter(name='PARTNER-ADMIN').exists()
+        return not "PARTNER-ADMIN" in self.user_groups
 
     def form_valid(self, form):
         with transaction.atomic():
@@ -72,12 +75,4 @@ class CooperateView(UserPassesTestMixin, FormView):
         messages.success(self.request, 'Ваша заявка на становление партнером успешно отправлена и теперь проходит проверку!')
 
         return super().form_valid(form) # Возвращаем успешный ответ
-
-    def get_context_data(self, **kwargs):
-        context = super().get_context_data(**kwargs)
-        context.update({
-            "title": "Сотрудничество",
-            "current_page": "cooperate"
-        }) 
-        return context
     

+ 0 - 22
sharix_admin/views/index.py

@@ -1,22 +0,0 @@
-from django.views.generic import TemplateView
-from django.utils.translation import gettext as _
-
-from .base import BaseView
-
-
-class IndexView(BaseView, TemplateView):
-    page_title = _('Home/Balance')
-    page_name = 'index'
-    template_name = 'sharix_admin/main.html'
-
-    def get_context_data(self, **kwargs):
-        context = super().get_context_data(**kwargs)
-
-        ph_num = str(self.request.user.phone_number)
-        convert_ph_num = f"+{ph_num[:1]} ({ph_num[1:4]}) {ph_num[4:7]}-{ph_num[7:9]}-{ph_num[9:11]}"
-
-        context.update({
-            'phone': convert_ph_num,
-        })
-
-        return context

+ 10 - 0
sharix_admin/views/main.py

@@ -0,0 +1,10 @@
+from django.views.generic import TemplateView
+from django.utils.translation import gettext as _
+
+from .base import BaseView
+
+
+class MainView(BaseView, TemplateView):
+    page_title = 'Добро пожаловать!'
+    page_name = 'main'
+    template_name = 'sharix_admin/main.html'

+ 5 - 7
sharix_admin/views/partner.py

@@ -3,8 +3,6 @@ from django.views.generic import DetailView
 from django.views.generic.edit import FormView
 from django.urls import reverse_lazy
 from django.shortcuts import get_object_or_404, redirect
-from django.utils.translation import gettext as _
-from django.contrib.auth.mixins import UserPassesTestMixin
 from django.contrib import messages
 from django.db import transaction
 
@@ -15,19 +13,19 @@ from sharix_admin.utils import *
 from .base import BaseView
 
 
-class PartnerBaseView(UserPassesTestMixin, BaseView):
+class PartnerBaseView(BaseView):
     page_name = 'partner'
 
     # Проверяем состояит ли текущий пользователь в группе PARTNER-ADMIN
     def test_func(self):
-        return self.request.user.groups.filter(name='PARTNER-ADMIN').exists()
+        return "PARTNER-ADMIN" in self.user_groups
 
 
 class PartnerDetailView(PartnerBaseView, DetailView):
     model = Company
     template_name = 'sharix_admin/partner.html'
     context_object_name = 'company'
-    page_title = _('О партнере')
+    page_title = 'О партнере'
    
     def get_object(self, queryset=None):
         return get_object_or_404(Company, repr_id=self.request.user)
@@ -49,7 +47,7 @@ class PartnerEditView(PartnerBaseView, FormView):
     template_name = 'sharix_admin/partner_edit.html'
     form_class = CompanyForm
     success_url = reverse_lazy('partner_detail')
-    page_title = _('Изменение данных партнера')
+    page_title = 'Изменение данных партнера'
 
     def get_form_kwargs(self):
         kwargs = super().get_form_kwargs()
@@ -89,7 +87,7 @@ class PartnerDocUploadView(PartnerBaseView, FormView):
         ).first()
 
         self.doc_name = self.doc.get_doc_type_display()
-        self.page_title = _("Изменение документа партнера: ") + self.doc_name
+        self.page_title = "Изменение документа партнера: " + self.doc_name
 
         return super().dispatch(request, *args, **kwargs)
 

+ 1 - 2
sharix_admin/views/partners.py

@@ -1,5 +1,4 @@
 from django_tables2 import SingleTableView
-from django.contrib.auth.mixins import UserPassesTestMixin
 from sharix_admin.utils import group_required
 from sharix_admin.tables import PartnersTable
 from django.contrib.auth.decorators import login_required
@@ -10,7 +9,7 @@ from django.utils.translation import gettext as _
 from .base import BaseView
 
 
-class PartnersListView(UserPassesTestMixin, BaseView, SingleTableView):
+class PartnersListView(BaseView, SingleTableView):
     page_title = _('Partners')
     page_name = 'partners'
     table_class = PartnersTable

+ 4 - 5
sharix_admin/views/service_type.py

@@ -1,7 +1,6 @@
 from django_tables2 import SingleTableView
 from django.views.generic.edit import UpdateView, CreateView, DeleteView
 from sharix_admin.tables import ServiceTypeTable
-from django.contrib.auth.mixins import UserPassesTestMixin
 from sharix_admin.forms import ServiceTypeCreateForm, ServiceTypeUpdateForm
 from dbsynce.models import ServiceType
 from django.urls import reverse
@@ -10,7 +9,7 @@ from django.utils.translation import gettext as _
 from .base import BaseView
 
     
-class ServiceTypeCreate(UserPassesTestMixin, BaseView, CreateView):
+class ServiceTypeCreate(BaseView, CreateView):
     page_title = _('Услуги сервиса')
     page_name = 'service_type'
     model = ServiceType
@@ -34,7 +33,7 @@ class ServiceTypeCreate(UserPassesTestMixin, BaseView, CreateView):
         return False
     
 
-class ServiceTypeListView(UserPassesTestMixin, BaseView, SingleTableView):
+class ServiceTypeListView(BaseView, SingleTableView):
     page_title = _('Услуги сервиса')
     page_name = 'service_type'
     table_class = ServiceTypeTable
@@ -59,7 +58,7 @@ class ServiceTypeListView(UserPassesTestMixin, BaseView, SingleTableView):
         return False
 
 
-class ServiceTypeUpdateView(UserPassesTestMixin, UpdateView):
+class ServiceTypeUpdateView(BaseView, UpdateView):
     model = ServiceType
     form_class = ServiceTypeCreateForm
     template_name = "sharix_admin/service_type_form.html"
@@ -84,7 +83,7 @@ class ServiceTypeUpdateView(UserPassesTestMixin, UpdateView):
         return reverse('service_type')
     
 
-class ServiceTypeDelete(UserPassesTestMixin, DeleteView):
+class ServiceTypeDelete(BaseView, DeleteView):
     model = ServiceType
     template_name = "sharix_admin/service_type_delete.html"