Skip to content

Commit

Permalink
new api (#413)
Browse files Browse the repository at this point in the history
* changing to SaaS

* saas beta

* restructuring

* restruturing

* restruturing

* restruturing

* restruturing

* restruturing

* added new api
  • Loading branch information
KingCSharp committed Nov 9, 2020
1 parent 5f1b628 commit 7c85207
Show file tree
Hide file tree
Showing 67 changed files with 3,070 additions and 183 deletions.
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,13 @@ sudo apt install postgresql xvfb libfontconfig wkhtmltopdf git libpq-dev python3
sudo gem install sass
sudo apt-get install postfix
```

#### postfix package installation process
* After running ```sudo apt-get install postfix``` in terminal, select ```Internet``` as a configuration from the pop-up and click ok. Next it will ask to enter the ```System mail name``` which will be the used as a ```From Email Address``` during sending the mail.

#### Install dependencies
---

Expand Down
12 changes: 12 additions & 0 deletions accounts/api_urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from django.urls import path
from accounts import api_views

app_name = 'api_accounts'

urlpatterns = [
path("accounts-list/", api_views.AccountsListView.as_view()),
path("accounts-create/", api_views.CreateAccountView.as_view()),
path("<int:pk>/view/", api_views.AccountDetailView.as_view()),
path("accounts/<int:pk>/update/", api_views.AccountUpdateView.as_view()),
path("accounts/<int:pk>/delete/", api_views.AccountDeleteView.as_view()),
]
500 changes: 500 additions & 0 deletions accounts/api_views.py

Large diffs are not rendered by default.

18 changes: 18 additions & 0 deletions accounts/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,24 @@ def __init__(self, *args, **kwargs):
if self.instance.id:
self.fields["lead"].required = False
self.fields["lead"].required = False
self.company = request_obj.company


def clean_name(self):
name = self.cleaned_data.get("name")
if self.instance.id:
if self.instance.name != name:
if not Account.objects.filter(
name__iexact=self.cleaned_data.get("name"),
company=self.company
).exists():
return self.cleaned_data.get("name")
raise forms.ValidationError(
"Account already exists with this name")
return self.cleaned_data.get("name")
if not Account.objects.filter(name__iexact=self.cleaned_data.get("name"), company=self.company).exists():
return self.cleaned_data.get("name")
raise forms.ValidationError("Account already exists with this name")

class Meta:
model = Account
Expand Down
85 changes: 85 additions & 0 deletions accounts/serializer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
from rest_framework import serializers
from accounts.models import Account, Email, Tags
from common.serializer import UserSerializer, CompanySerializer
from leads.serializer import LeadSerializer
from teams.serializer import TeamsSerializer
from contacts.serializer import ContactSerializer


class TagsSerailizer(serializers.ModelSerializer):
class Meta:
model = Tags
fields = (
"name",
"slug"
)


class AccountSerializer(serializers.ModelSerializer):
created_by = UserSerializer()
lead = LeadSerializer()
company = CompanySerializer()
tags = TagsSerailizer(read_only=True, many=True)
assigned_to = UserSerializer(read_only=True, many=True)
contacts = ContactSerializer(read_only=True, many=True)
teams = TeamsSerializer(read_only=True, many=True)

class Meta:
model = Account
# fields = ‘__all__’
fields = (
'id',
"name",
"email",
"phone",
"industry",
"billing_address_line",
"billing_street",
"billing_city",
"billing_state",
"billing_postcode",
"billing_country",
"website",
"description",
"created_by",
"created_on",
"is_active",
"tags",
"status",
"lead",
"contact_name",
"contacts",
"assigned_to",
"teams",
"company"
)


class EmailSerializer(serializers.ModelSerializer):

class Meta:
model = Email
fields = (
"from_account"
"recipients"
"message_subject"
"message_body"
"timezone"
"scheduled_date_time"
"scheduled_later"
"created_on"
"from_email"
"rendered_message_body"
)


class EmailLogSerializer(serializers.ModelSerializer):
email = EmailSerializer()

class Meta:
model = Email
fields = (
"email"
"contact"
"is_sent"
)
66 changes: 66 additions & 0 deletions accounts/swagger_params.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
from drf_yasg import openapi

company_params_in_header = openapi.Parameter(
'company', openapi.IN_HEADER, required=True, type=openapi.TYPE_STRING)


account_list_get_params = [company_params_in_header]

account_list_post_params = [company_params_in_header]

account_create_get_params = [company_params_in_header]

account_create_post_params = [
company_params_in_header,
openapi.Parameter('name', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('phone', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('email', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('billing_address_line', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('billing_street', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('billing_city', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('billing_state', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('billing_postcode', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('billing_country', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('contacts', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
]


account_update_get_params = [company_params_in_header]

account_update_post_params = [
company_params_in_header,
openapi.Parameter('name', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('phone', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('email', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('billing_address_line', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('billing_street', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('billing_city', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('billing_state', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('billing_postcode', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('billing_country', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
openapi.Parameter('contacts', openapi.IN_QUERY,
required=True, type=openapi.TYPE_STRING),
]

account_delete_params = [
company_params_in_header,
]
1 change: 1 addition & 0 deletions accounts/templates/create_account.html
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,7 @@ <h3 class="mt-5">Create a <a href="{% url 'contacts:add_contact' %}">contact</a>
$('#submit_btn').removeAttr('disabled')
}
else {
alert(data.message)
window.location = data.success_url;
}
}
Expand Down
14 changes: 11 additions & 3 deletions accounts/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,8 @@ def form_valid(self, form):
return redirect("accounts:new_account")

if self.request.is_ajax():
data = {"success_url": reverse_lazy("accounts:list"), "error": False}
data = {"success_url": reverse_lazy("accounts:list"), "error": False,
"message": "Account created successfully"}
return JsonResponse(data)

return redirect("accounts:list")
Expand Down Expand Up @@ -366,6 +367,7 @@ class AccountUpdateView(SalesAccessRequiredMixin, LoginRequiredMixin, UpdateView
def dispatch(self, request, *args, **kwargs):
self.users = User.objects.filter(is_active=True).order_by("email")
lead_obj = self.get_object()
self.account_status = lead_obj.status
if lead_obj.company != request.company:
raise PermissionDenied
# if self.request.user.role == 'ADMIN' or self.request.user.is_superuser:
Expand Down Expand Up @@ -453,9 +455,15 @@ def form_valid(self, form):
domain=current_site.domain,
protocol=self.request.scheme,
)

message = "Account updated successfully"
if self.account_status != account_object.status:
if account_object.status == "open":
message = "Account opened successfully"
else:
message = "Account closed successfully"
if self.request.is_ajax():
data = {"success_url": reverse_lazy("accounts:list"), "error": False}
data = {"success_url": reverse_lazy("accounts:list"), "error": False,
"message": message}
return JsonResponse(data)
return redirect("accounts:list")

Expand Down
43 changes: 43 additions & 0 deletions cases/serializer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from rest_framework import serializers
from cases.models import Case
from common.serializer import UserSerializer, CompanySerializer
from teams.serializer import TeamsSerializer
from accounts.serializer import AccountSerializer
from contacts.serializer import ContactSerializer


class CaseSerializer(serializers.ModelSerializer):
account = AccountSerializer(read_only=True, many=True)
contacts = ContactSerializer(read_only=True, many=True)
assigned_to = UserSerializer(read_only=True, many=True)
created_by = UserSerializer(read_only=True)
teams = TeamsSerializer(read_only=True, many=True)
company = CompanySerializer()
get_team_users = UserSerializer(read_only=True, many=True)
get_team_and_assigned_users = UserSerializer(read_only=True, many=True)
get_assigned_users_not_in_teams = UserSerializer(read_only=True, many=True)


class Meta:
model = Case
fields = (
'id',
'name',
'status',
'priority',
'case_type',
'account',
'contacts',
'closed_on',
'description',
'assigned_to',
'created_by',
'created_on',
'is_active',
'teams',
'company',
'get_team_users',
'get_team_and_assigned_users',
"get_assigned_users_not_in_teams",
"created_on_arrow",
)
24 changes: 24 additions & 0 deletions common/api_urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from django.urls import path
from common import api_views


app_name = "api_common"


urlpatterns = [
path("dashboard/", api_views.ApiHomeView.as_view()),
path("registration/", api_views.RegistrationView.as_view()),
path("login/", api_views.LoginView.as_view()),
path("validate-subdomain/", api_views.check_sub_domain),
path("profile/", api_views.ProfileView.as_view()),
path("get_teams_and_users/", api_views.GetTeamsAndUsersView.as_view()),
path("change-password/", api_views.ChangePasswordView.as_view(), name="change_password"),
path("forgot-password/", api_views.ForgotPasswordView.as_view()),
path("reset-password/", api_views.ResetPasswordView.as_view(), name='reset_password'),
path("users/list/", api_views.UsersListView.as_view(), name="users_list"),
path("users/<int:pk>/view/", api_views.UserDetailView.as_view(), name="view_user"),
# path("users/create/", api_views.CreateUserView.as_view(), name="create_user"),
path("documents/create/", api_views.DocumentCreate.as_view(), name="create_doc"),
#To be checked
path("users/<int:pk>/delete/", api_views.UserDeleteView.as_view(), name="remove_user"),
]
Loading

0 comments on commit 7c85207

Please sign in to comment.