Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/timezone query #8

Merged
merged 7 commits into from
Dec 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ __pycache__/

# static and media files in root
/static/
/media/
/mediafiles/


# C extensions
Expand Down
3 changes: 2 additions & 1 deletion OneSila/OneSila/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from core.schema.countries import CountryQuery
from core.schema.languages import LanguageQuery
from core.schema.multi_tenant import MultiTenantQuery, MultiTenantMutation, MultiTenantSubscription
from core.schema.timezones import TimeZoneQuery
from currencies.schema import CurrenciesQuery, CurrenciesMutation, CurrenciesSubscription
from customs.schema import CustomsQuery, CustomsMutation, CustomsSubscription
from eancodes.schema import EanCodesQuery, EanCodesMutation, EanCodesSubscription
Expand All @@ -33,7 +34,7 @@
class Query(ContactsQuery, CurrenciesQuery, CustomsQuery, CountryQuery, EanCodesQuery,
InventoryQuery, LanguageQuery, MediaQuery, MultiTenantQuery, OrdersQuery,
ProductsQuery, PropertiesQuery, PurchasingQuery, SalesPricesQuery, TaxesQuery,
UnitsQuery):
TimeZoneQuery, UnitsQuery):
pass


Expand Down
9 changes: 6 additions & 3 deletions OneSila/core/models/multi_tenant.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from imagekit.processors import ResizeToFill
from imagekit.exceptions import MissingSource

from core.typing import LanguageType
from core.typing import LanguageType, TimezoneType
from core.helpers import get_languages
from core.managers import MultiTenantManager, MultiTenantUserLoginTokenManager
from core.validators import phone_regex, validate_image_extension, \
Expand Down Expand Up @@ -94,7 +94,7 @@ class MultiTenantUser(AbstractUser, MultiTenantAwareMixin):

# Profile data:
language = models.CharField(max_length=7, choices=LANGUAGE_CHOICES, default=settings.LANGUAGE_CODE)
timezone = models.CharField(max_length=35, choices=TIMEZONE_CHOICES, default=DEFAULT_TIMEZONE)
timezone = models.CharField(max_length=35, choices=TIMEZONE_CHOICES, default=timezone.get_default_timezone().key)
mobile_number = models.CharField(validators=[phone_regex], max_length=17, blank=True, null=True)
whatsapp_number = models.CharField(validators=[phone_regex], max_length=17, blank=True, null=True)
telegram_number = models.CharField(validators=[phone_regex], max_length=17, blank=True, null=True)
Expand All @@ -114,14 +114,17 @@ def save(self, *args, **kwargs):
super().save(*args, **kwargs)

def avatar_resized_full_url(self):
if self.avatar_resized.url:
if self.avatar:
return f"{generate_absolute_url(trailing_slash=False)}{self.avatar_resized.url}"

return None

def language_detail(self):
return LanguageType(**get_language_info(self.language))

def timezone_detail(self):
return TimezoneType(key=self.timezone)

def set_active(self, save=True):
self.is_active = True

Expand Down
3 changes: 3 additions & 0 deletions OneSila/core/schema/multi_tenant/types/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
from strawberry_django.fields.types import DjangoImageType
from typing import List, TYPE_CHECKING, Dict

from core.typing import TimezoneType

if TYPE_CHECKING:
from core.schema.languages.types.types import LanguageType

Expand All @@ -19,6 +21,7 @@ class MultiTenantUserType(relay.Node):
avatar_resized: DjangoImageType | None
avatar_resized_full_url: str | None
language_detail: Annotated['LanguageType', lazy("core.schema.languages.types.types")]
timezone_detail: TimezoneType
multi_tenant_company: Annotated['MultiTenantCompanyType', lazy("core.schema.multi_tenant.types.types")]


Expand Down
1 change: 1 addition & 0 deletions OneSila/core/schema/timezones/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .queries import TimeZoneQuery
39 changes: 39 additions & 0 deletions OneSila/core/schema/timezones/queries.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from strawberry_django import auth, field

from django.contrib.auth.models import AnonymousUser
from django.utils import timezone
from django.conf import settings

from core.schema.core.helpers import get_multi_tenant_company
from core.schema.multi_tenant.types.types import MultiTenantUserType, MultiTenantCompanyType
from core.schema.core.queries import node, connection, ListConnectionWithTotalCount, \
type, field, default_extensions, Info, anonymous_field

from typing import List

from core.schema.timezones.types.types import TimeZoneType
from core.schema.core.helpers import get_current_user

from pytz import all_timezones


def get_timezones(info) -> List[TimeZoneType]:
timezones = [TimeZoneType(key=key) for key in all_timezones]
return timezones


def get_default_timezone() -> TimeZoneType:
return TimeZoneType(key=timezone.get_default_timezone().key)


def get_current_user_timezone(info) -> TimeZoneType:
user = get_current_user(info)
tz = TimeZoneType(key=user.timezone)
return tz


@type(name="Query")
class TimeZoneQuery:
default_timezone: TimeZoneType = anonymous_field(resolver=get_default_timezone)
current_user_timezone: TimeZoneType = field(resolver=get_current_user_timezone)
timezones: List[TimeZoneType] = anonymous_field(resolver=get_timezones)
Empty file.
6 changes: 6 additions & 0 deletions OneSila/core/schema/timezones/types/types.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from core.schema.core.types.types import strawberry_type


@strawberry_type
class TimeZoneType:
key: str
3 changes: 3 additions & 0 deletions OneSila/core/tests/tests_schemas/mutations.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@
code
name
}
timezoneDetail {
key
}
multiTenantCompany{
id
}
Expand Down
51 changes: 51 additions & 0 deletions OneSila/core/tests/tests_schemas/tests_queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,54 @@ def test_current_lang(self):

self.assertTrue(resp.errors is None)
self.assertTrue(resp.data is not None)


class TestTimeZoneQuery(TransactionTestCaseMixin, TransactionTestCase):
def test_languages(self):
query = """
query timezones{
timezones{
key
}
}
"""

# Make sure you are logged out first. The test-client is
# logged in by default.
# resp = self.stawberry_anonymous_test_client(query=ME_QUERY)
# self.assertTrue(resp.errors is not None)

resp = self.stawberry_anonymous_test_client(
query=query)

self.assertTrue(resp.errors is None)
self.assertTrue(resp.data is not None)

def test_default_timezone(self):
query = """
query defaultTimezone{
defaultTimezone{
key
}
}
"""

resp = self.stawberry_anonymous_test_client(
query=query)

self.assertTrue(resp.errors is None)
self.assertTrue(resp.data is not None)

def test_current_user_timezone(self):
query = """
query currentUserTimezone{
currentUserTimezone{
key
}
}
"""
resp = self.stawberry_test_client(
query=query)

self.assertTrue(resp.errors is None)
self.assertTrue(resp.data is not None)
5 changes: 5 additions & 0 deletions OneSila/core/typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,8 @@ class LanguageType:
name: str
name_local: str
name_translated: str


@strawberry.type
class TimezoneType:
key: str
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ django-dirtyfields
django-cors-headers
tzdata
shortuuid
pytz

# Using fork to ensure we have better authentication error support
strawberry-graphql-django
Expand Down
Loading