Skip to content

Commit d688f0f

Browse files
authored
Merge pull request #172 from PotLock/testnet
Testnet -> Dev
2 parents 0ee7b3d + 8b2a160 commit d688f0f

File tree

20 files changed

+2416
-43
lines changed

20 files changed

+2416
-43
lines changed

api/urls.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@
1818
DonorsAPI,
1919
)
2020
from base.api import StatsAPI, ReclaimProofRequestView
21+
from campaigns.api import (
22+
AllCampaignDonationsAPI,
23+
CampaignContractConfigAPI,
24+
CampaignDetailAPI,
25+
CampaignDonationsAPI,
26+
CampaignsAPI,
27+
)
2128
from donations.api import DonationContractConfigAPI
2229
from grantpicks.api import AccountProjectListAPI, ProjectListAPI, ProjectRoundVotesAPI, ProjectStatsAPI, RoundApplicationsAPI, RoundDetailAPI, RoundsListAPI
2330
from lists.api import (
@@ -102,6 +109,28 @@
102109
DonationContractConfigAPI.as_view(),
103110
name="donate_contract_config_api",
104111
),
112+
# campaigns
113+
path("v1/campaigns", CampaignsAPI.as_view(), name="campaigns_api"),
114+
path(
115+
"v1/campaigns/<int:campaign_id>",
116+
CampaignDetailAPI.as_view(),
117+
name="campaigns_api_by_id",
118+
),
119+
path(
120+
"v1/campaigns/<int:campaign_id>/donations",
121+
CampaignDonationsAPI.as_view(),
122+
name="campaigns_donations_api",
123+
),
124+
path(
125+
"v1/campaign_donations",
126+
AllCampaignDonationsAPI.as_view(),
127+
name="all_campaign_donations_api",
128+
),
129+
path(
130+
"v1/campaign_contract_config",
131+
CampaignContractConfigAPI.as_view(),
132+
name="campaign_contract_config_api",
133+
),
105134
# donors
106135
path("v1/donors", DonorsAPI.as_view(), name="donors_api"),
107136
# lists

base/settings.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@
6767
POTLOCK_TLA = "potlock.testnet" if ENVIRONMENT == "testnet" else ("staging.potlock.near" if ENVIRONMENT == "dev" else "potlock.near")
6868
# NADABOT_TLA = "nadabot.testnet" if ENVIRONMENT == "testnet" else "nadabot.near"
6969
NADABOT_TLA = "nadabot.testnet" if ENVIRONMENT == "testnet" else ("staging.nadabot.near" if ENVIRONMENT == "dev" else "nadabot.near")
70-
STELLAR_CONTRACT_ID = "CA7A2776JYIOYXPAJFONDC7BVPDWWLZU524UTGIJIQH6HWWOR6LKYQQT" if ENVIRONMENT == "testnet" else ("" if ENVIRONMENT == "dev" else "")
71-
STELLAR_PROJECTS_REGISTRY_CONTRACT = "CA56XSY7YEZ7CJ5FYG7YODQIWE3JNRGZ5S7E7VJAQ675KDS4BLZJ5NJH" if ENVIRONMENT == "testnet" else ("" if ENVIRONMENT == "dev" else "")
70+
STELLAR_CONTRACT_ID = "CAG7ZLJNXZGFGIR2VB3JVHFA6XF4U3TAIEZLLZQWI6XFX7DC3EG6NU4G" if ENVIRONMENT == "testnet" else ("" if ENVIRONMENT == "dev" else "")
71+
STELLAR_PROJECTS_REGISTRY_CONTRACT = "CBFQ2T4GJI4NN4GI5MQXQNAORDGPKD5XGG7UZ5IVLAQLHJROQQ4KRPP5" if ENVIRONMENT == "testnet" else ("" if ENVIRONMENT == "dev" else "")
7272
NEAR_SOCIAL_CONTRACT_ADDRESS = (
7373
"v1.social08.testnet" if ENVIRONMENT == "testnet" else "social.near"
7474
)
@@ -125,7 +125,8 @@
125125
"tokens",
126126
"nadabot",
127127
"chains",
128-
"grantpicks"
128+
"grantpicks",
129+
"campaigns"
129130
]
130131

131132
DEFAULT_PAGE_SIZE = 30

campaigns/__init__.py

Whitespace-only changes.

campaigns/admin.py

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
from django.contrib import admin
2+
from django.utils.dateformat import format
3+
from django.utils.timezone import localtime
4+
5+
from .models import Campaign, CampaignDonation
6+
7+
8+
@admin.register(Campaign)
9+
class CampaignAdmin(admin.ModelAdmin):
10+
list_display = [
11+
"on_chain_id",
12+
"name",
13+
"owner_address",
14+
"recipient_address",
15+
"token_address",
16+
"target_amount",
17+
"total_raised_amount",
18+
"net_raised_amount",
19+
"start_at",
20+
"end_at",
21+
"created_at",
22+
"allow_fee_avoidance",
23+
]
24+
list_filter = (
25+
"start_at",
26+
"end_at",
27+
"created_at",
28+
"allow_fee_avoidance",
29+
"owner",
30+
"recipient",
31+
"token",
32+
)
33+
search_fields = (
34+
"name",
35+
"description",
36+
"owner__id",
37+
"recipient__id",
38+
"on_chain_id",
39+
)
40+
date_hierarchy = "created_at"
41+
ordering = ("-created_at",)
42+
readonly_fields = (
43+
"on_chain_id",
44+
"created_at",
45+
"total_raised_amount",
46+
"total_raised_amount_usd",
47+
"net_raised_amount",
48+
"net_raised_amount_usd",
49+
"escrow_balance",
50+
"escrow_balance_usd",
51+
)
52+
53+
def get_queryset(self, request):
54+
return (
55+
super()
56+
.get_queryset(request)
57+
.select_related("owner", "recipient", "token")
58+
.prefetch_related("donations")
59+
)
60+
61+
def owner_address(self, obj):
62+
return obj.owner.id
63+
owner_address.admin_order_field = "owner__id"
64+
owner_address.short_description = "Owner Address"
65+
66+
def recipient_address(self, obj):
67+
return obj.recipient.id
68+
recipient_address.admin_order_field = "recipient__id"
69+
recipient_address.short_description = "Recipient Address"
70+
71+
def token_address(self, obj):
72+
return obj.token.account.id if obj.token else "NEAR"
73+
token_address.admin_order_field = "token__account__id"
74+
token_address.short_description = "Token"
75+
76+
def has_add_permission(self, request):
77+
return False
78+
79+
def has_change_permission(self, request, obj=None):
80+
# Allow viewing but restrict editing of calculated fields
81+
return True
82+
83+
def has_delete_permission(self, request, obj=None):
84+
return False
85+
86+
87+
@admin.register(CampaignDonation)
88+
class CampaignDonationAdmin(admin.ModelAdmin):
89+
list_display = [
90+
"on_chain_id",
91+
"campaign_id_display",
92+
"campaign_name",
93+
"donor_address",
94+
"token_address",
95+
"total_amount",
96+
"total_amount_usd",
97+
"net_amount",
98+
"net_amount_usd",
99+
"donated_at",
100+
"returned_at",
101+
"tx_hash",
102+
]
103+
list_filter = (
104+
"donated_at",
105+
"returned_at",
106+
"campaign",
107+
"donor",
108+
"token",
109+
"referrer",
110+
)
111+
search_fields = (
112+
"message",
113+
"donor__id",
114+
"campaign__name",
115+
"campaign__on_chain_id",
116+
"on_chain_id",
117+
"tx_hash",
118+
)
119+
date_hierarchy = "donated_at"
120+
ordering = ("-donated_at",)
121+
readonly_fields = (
122+
"on_chain_id",
123+
"total_amount_usd",
124+
"net_amount_usd",
125+
"protocol_fee_usd",
126+
"referrer_fee_usd",
127+
"creator_fee_usd",
128+
"donated_at",
129+
"returned_at",
130+
"tx_hash",
131+
)
132+
133+
def get_queryset(self, request):
134+
return (
135+
super()
136+
.get_queryset(request)
137+
.select_related("campaign", "donor", "token", "referrer")
138+
)
139+
140+
def campaign_id_display(self, obj):
141+
return obj.campaign.on_chain_id
142+
campaign_id_display.admin_order_field = "campaign__on_chain_id"
143+
campaign_id_display.short_description = "Campaign ID"
144+
145+
def campaign_name(self, obj):
146+
return obj.campaign.name
147+
campaign_name.admin_order_field = "campaign__name"
148+
campaign_name.short_description = "Campaign Name"
149+
150+
def donor_address(self, obj):
151+
return obj.donor.id
152+
donor_address.admin_order_field = "donor__id"
153+
donor_address.short_description = "Donor Address"
154+
155+
def token_address(self, obj):
156+
return obj.token.account.id if obj.token else "NEAR"
157+
token_address.admin_order_field = "token__account__id"
158+
token_address.short_description = "Token"
159+
160+
def formfield_for_dbfield(self, db_field, request, **kwargs):
161+
field = super(CampaignDonationAdmin, self).formfield_for_dbfield(
162+
db_field, request, **kwargs
163+
)
164+
if db_field.name in ["donated_at", "returned_at"]:
165+
field.widget.format = "%d-%m-%Y %H:%M"
166+
field.widget.attrs.update({"class": "vDateField", "size": "20"})
167+
return field
168+
169+
def has_add_permission(self, request):
170+
return False
171+
172+
def has_change_permission(self, request, obj=None):
173+
return False
174+
175+
def has_delete_permission(self, request, obj=None):
176+
return False

0 commit comments

Comments
 (0)