Skip to content

Commit 3189c66

Browse files
authored
Merge pull request #89 from ambitioninc/develop
0.15.0
2 parents bacc499 + 6d343bf commit 3189c66

8 files changed

Lines changed: 59 additions & 26 deletions

File tree

.travis.yml

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,16 @@ python:
44
- '2.7'
55
- '3.4'
66
- '3.5'
7+
- '3.6'
78
env:
89
global:
910
- DB=postgres
1011
matrix:
11-
- DJANGO=">=1.8,<1.9"
1212
- DJANGO=">=1.9,<1.10"
1313
- DJANGO=">=1.10,<1.11"
14-
before_install:
15-
- sudo /etc/init.d/postgresql stop
16-
- sudo apt-get -y remove --purge postgresql-9.1
17-
- sudo apt-get -y remove --purge postgresql-9.2
18-
- sudo apt-get -y remove --purge postgresql-9.3
19-
- sudo apt-get -y remove --purge postgresql-9.4
20-
- sudo apt-get -y autoremove
21-
- sudo apt-key adv --keyserver keys.gnupg.net --recv-keys 7FCC7D46ACCC4CF8
22-
- sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main 9.5" >> /etc/apt/sources.list.d/postgresql.list'
23-
- sudo apt-get update
24-
- sudo apt-get -y install postgresql-9.5
25-
- sudo sh -c 'echo "local all postgres trust" > /etc/postgresql/9.5/main/pg_hba.conf'
26-
- sudo sh -c 'echo -n "host all all 127.0.0.1/32 trust" >> /etc/postgresql/9.5/main/pg_hba.conf'
27-
- sudo /etc/init.d/postgresql restart
28-
- psql --version
14+
- DJANGO=">=1.11,<2.0"
15+
addons:
16+
postgresql: '9.5'
2917
install:
3018
- pip install -q coverage coveralls flake8 Django$DJANGO django-nose>=1.4
3119
before_script:

docs/release_notes.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
Release Notes
22
=============
33

4+
v0.15.0
5+
-------
6+
* Handle custom db column names
7+
* Drop Django 1.8
8+
* Support Django 1.10
9+
* Support Django 1.11
10+
* Support Python 3.6
11+
412
v0.14.3
513
-------
614
* Respect return_models in upsert method when building upsert sql

querybuilder/query.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ def set_right_table(self, table):
176176
field.get_internal_type() == 'OneToOneField' or
177177
field.get_internal_type() == 'ForeignKey'
178178
):
179-
if field.rel.to == self.right_table.model:
179+
if field.remote_field.model == self.right_table.model:
180180
if self.right_table.field_prefix is None:
181181
self.right_table.field_prefix = field.name
182182
return
@@ -216,7 +216,7 @@ def get_condition(self):
216216
field.get_internal_type() == 'OneToOneField' or
217217
field.get_internal_type() == 'ForeignKey'
218218
):
219-
if field.rel.to == self.left_table.model:
219+
if field.remote_field.model == self.left_table.model:
220220
table_join_field = field.column
221221
# self.table_join_name = field.name
222222
condition = '{0}.{1} = {2}.{3}'.format(
@@ -1237,7 +1237,8 @@ def get_upsert_sql(
12371237
placeholders = []
12381238
for field in all_fields:
12391239
# Convert field value to db value
1240-
sql_args.append(field.get_db_prep_save(getattr(row, field.column), self.connection))
1240+
# Use attname here to support fields with custom db_column names
1241+
sql_args.append(field.get_db_prep_save(getattr(row, field.attname), self.connection))
12411242
placeholders.append('%s')
12421243
row_values.append('({0})'.format(', '.join(placeholders)))
12431244
row_values_sql = ', '.join(row_values)

querybuilder/tests/migrations/0001_initial.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class Migration(migrations.Migration):
6464
('field6', models.CharField(max_length=16)),
6565
('field7', models.CharField(max_length=16)),
6666
('field8', json_field),
67+
('custom_field_name', models.CharField(max_length=16, null=True, default='foo', db_column='actual_db_column_name')),
6768
],
6869
),
6970
migrations.CreateModel(

querybuilder/tests/models.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class Account(models.Model):
1616
"""
1717
Account model
1818
"""
19-
user = models.OneToOneField(User)
19+
user = models.OneToOneField(User, on_delete=models.CASCADE)
2020
first_name = models.CharField(max_length=64)
2121
last_name = models.CharField(max_length=64)
2222

@@ -25,7 +25,7 @@ class Order(models.Model):
2525
"""
2626
Order model
2727
"""
28-
account = models.ForeignKey(Account)
28+
account = models.ForeignKey(Account, on_delete=models.CASCADE)
2929
revenue = models.FloatField(null=True)
3030
margin = models.FloatField()
3131
margin_percent = models.FloatField()
@@ -52,6 +52,9 @@ class Uniques(models.Model):
5252
field6 = models.CharField(max_length=16)
5353
field7 = models.CharField(max_length=16)
5454
field8 = JSONField(default={})
55+
custom_field_name = models.CharField(
56+
max_length=16, null=True, default='foo', db_column='actual_db_column_name'
57+
)
5558

5659
class Meta:
5760
unique_together = ('field6', 'field7')

querybuilder/tests/upsert_tests.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,34 @@ def test_upsert_pk_return_models(self):
216216
self.assertEqual(users[0].email, 'user1change')
217217
self.assertEqual(users[1].email, 'user2')
218218
self.assertEqual(users[2].email, 'user3')
219+
220+
def test_upsert_custom_db_column(self):
221+
"""
222+
Makes sure upserting a model containing a field with a custom db_column name works.
223+
"""
224+
225+
model = Uniques(field1='1', custom_field_name='test')
226+
227+
Query().from_table(Uniques).upsert(
228+
[model],
229+
unique_fields=['field1'],
230+
update_fields=[]
231+
)
232+
233+
saved_model = Uniques.objects.get()
234+
235+
self.assertEqual(saved_model.custom_field_name, 'test')
236+
237+
saved_model.custom_field_name = 'edited'
238+
239+
Query().from_table(Uniques).upsert(
240+
[saved_model],
241+
unique_fields=['field1'],
242+
update_fields=['custom_field_name']
243+
)
244+
245+
updated_model = Uniques.objects.get()
246+
self.assertEqual(updated_model.custom_field_name, 'edited')
247+
248+
rows = Query().from_table(Uniques).select()
249+
self.assertEqual(rows[0]['actual_db_column_name'], 'edited')

querybuilder/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '0.14.3'
1+
__version__ = '0.15.0'

setup.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,28 +32,29 @@ def get_version():
3232
'Programming Language :: Python :: 2.7',
3333
'Programming Language :: Python :: 3.4',
3434
'Programming Language :: Python :: 3.5',
35+
'Programming Language :: Python :: 3.6',
3536
'Intended Audience :: Developers',
3637
'License :: OSI Approved :: MIT License',
3738
'Operating System :: OS Independent',
3839
'Framework :: Django',
39-
'Framework :: Django :: 1.8',
4040
'Framework :: Django :: 1.9',
4141
'Framework :: Django :: 1.10',
42+
'Framework :: Django :: 1.11',
4243
'Development Status :: 5 - Production/Stable',
4344
],
4445
license='MIT',
4546
install_requires=[
46-
'django>=1.8',
47+
'Django>=1.9',
4748
'pytz>=2015.6',
4849
'fleming>=0.4.4',
4950
'six',
5051
],
5152
tests_require=[
5253
'psycopg2',
5354
'django-nose>=1.4',
54-
'django-dynamic-fixture==1.8.5',
55+
'django-dynamic-fixture',
5556
'jsonfield==0.9.20',
56-
'mock==1.0.1'
57+
'mock'
5758
],
5859
test_suite='run_tests.run_tests',
5960
include_package_data=True,

0 commit comments

Comments
 (0)